Merge branch 'stable-2.15'
* stable-2.15:
Fix access path propagation on git/ssh protocol
Fix support for setting owner of group to a single user
Set version to 2.15.5
Set version to 2.14.15
Add tests for .gitmodules validation
Remove occurrence of "is="gr-select"" in gr-create-project-dialog
Add support for "max_object_size_limit" effective value
Update JGit to 4.7.5.201810051826-r
Update JGit to 4.9.6.201810051924-r
ElasticContainer: Use Elasticsearch 6.4.2 for V6_4 tests
Upgrade elasticsearch-rest-client to 6.4.2
Upgrade jackson-core to 2.9.7
This merge partially reverts change I27fc60caf ("Upgrade jackson-core to
2.9.7") which limited the visibility of jackson-core to Elasticsearch.
Since change If4d62922f, jackson-core is exported in the plugin API
and thus its visibility cannot be restricted.
Change-Id: I69847856636ad3084d78686a02414b771cf38033
This commit is contained in:
@@ -32,8 +32,6 @@ public abstract class AbstractGitCommand extends BaseCommand {
|
||||
@Argument(index = 0, metaVar = "PROJECT.git", required = true, usage = "project name")
|
||||
protected ProjectState projectState;
|
||||
|
||||
@Inject private SshScope sshScope;
|
||||
|
||||
@Inject private GitRepositoryManager repoManager;
|
||||
|
||||
@Inject private SshSession session;
|
||||
@@ -49,28 +47,24 @@ public abstract class AbstractGitCommand extends BaseCommand {
|
||||
@Override
|
||||
public void start(Environment env) {
|
||||
Context ctx = context.subContext(newSession(), context.getCommandLine());
|
||||
final Context old = sshScope.set(ctx);
|
||||
try {
|
||||
startThread(
|
||||
new ProjectCommandRunnable() {
|
||||
@Override
|
||||
public void executeParseCommand() throws Exception {
|
||||
parseCommandLine();
|
||||
}
|
||||
startThreadWithContext(
|
||||
ctx,
|
||||
new ProjectCommandRunnable() {
|
||||
@Override
|
||||
public void executeParseCommand() throws Exception {
|
||||
parseCommandLine();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() throws Exception {
|
||||
AbstractGitCommand.this.service();
|
||||
}
|
||||
@Override
|
||||
public void run() throws Exception {
|
||||
AbstractGitCommand.this.service();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project.NameKey getProjectName() {
|
||||
return projectState.getNameKey();
|
||||
}
|
||||
});
|
||||
} finally {
|
||||
sshScope.set(old);
|
||||
}
|
||||
@Override
|
||||
public Project.NameKey getProjectName() {
|
||||
return projectState.getNameKey();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private SshSession newSession() {
|
||||
|
||||
@@ -50,6 +50,7 @@ import java.io.OutputStreamWriter;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
@@ -260,6 +261,38 @@ public abstract class BaseCommand implements Command {
|
||||
return cmdLineParserFactory.create(options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Spawn a function into its own thread with the provided context.
|
||||
*
|
||||
* <p>Typically this should be invoked within {@link Command#start(Environment)}, such as:
|
||||
*
|
||||
* <pre>
|
||||
* startThreadWithContext(SshScope.Context context, new CommandRunnable() {
|
||||
* public void run() throws Exception {
|
||||
* runImp();
|
||||
* }
|
||||
* });
|
||||
* </pre>
|
||||
*
|
||||
* <p>If the function throws an exception, it is translated to a simple message for the client, a
|
||||
* non-zero exit code, and the stack trace is logged.
|
||||
*
|
||||
* @param thunk the runnable to execute on the thread, performing the command's logic.
|
||||
*/
|
||||
protected void startThreadWithContext(SshScope.Context context, CommandRunnable thunk) {
|
||||
final TaskThunk tt = new TaskThunk(thunk, Optional.ofNullable(context));
|
||||
|
||||
if (isAdminHighPriorityCommand()) {
|
||||
// Admin commands should not block the main work threads (there
|
||||
// might be an interactive shell there), nor should they wait
|
||||
// for the main work threads.
|
||||
//
|
||||
new Thread(tt, tt.toString()).start();
|
||||
} else {
|
||||
task.set(executor.submit(tt));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Spawn a function into its own thread.
|
||||
*
|
||||
@@ -278,18 +311,8 @@ public abstract class BaseCommand implements Command {
|
||||
*
|
||||
* @param thunk the runnable to execute on the thread, performing the command's logic.
|
||||
*/
|
||||
protected void startThread(CommandRunnable thunk) {
|
||||
final TaskThunk tt = new TaskThunk(thunk);
|
||||
|
||||
if (isAdminHighPriorityCommand()) {
|
||||
// Admin commands should not block the main work threads (there
|
||||
// might be an interactive shell there), nor should they wait
|
||||
// for the main work threads.
|
||||
//
|
||||
new Thread(tt, tt.toString()).start();
|
||||
} else {
|
||||
task.set(executor.submit(tt));
|
||||
}
|
||||
protected void startThread(final CommandRunnable thunk) {
|
||||
startThreadWithContext(null, thunk);
|
||||
}
|
||||
|
||||
private boolean isAdminHighPriorityCommand() {
|
||||
@@ -416,18 +439,21 @@ public abstract class BaseCommand implements Command {
|
||||
|
||||
private final class TaskThunk implements CancelableRunnable, ProjectRunnable {
|
||||
private final CommandRunnable thunk;
|
||||
private final Context taskContext;
|
||||
private final String taskName;
|
||||
|
||||
private Project.NameKey projectName;
|
||||
|
||||
private TaskThunk(CommandRunnable thunk) {
|
||||
private TaskThunk(CommandRunnable thunk, Optional<Context> oneOffContext) {
|
||||
this.thunk = thunk;
|
||||
this.taskName = getTaskName();
|
||||
this.taskContext = oneOffContext.orElse(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel() {
|
||||
synchronized (this) {
|
||||
final Context old = sshScope.set(context);
|
||||
final Context old = sshScope.set(taskContext);
|
||||
try {
|
||||
onExit(STATUS_CANCEL);
|
||||
} finally {
|
||||
@@ -442,7 +468,7 @@ public abstract class BaseCommand implements Command {
|
||||
final Thread thisThread = Thread.currentThread();
|
||||
final String thisName = thisThread.getName();
|
||||
int rc = 0;
|
||||
final Context old = sshScope.set(context);
|
||||
final Context old = sshScope.set(taskContext);
|
||||
try {
|
||||
context.started = TimeUtil.nowMs();
|
||||
thisThread.setName("SSH " + taskName);
|
||||
|
||||
Reference in New Issue
Block a user