You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RemoteHelperDriver.java 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package org.eclipse.jgit.integrate.remotehelper;
  2. import org.eclipse.jgit.lib.ProgressMonitor;
  3. import org.eclipse.jgit.lib.Repository;
  4. import org.eclipse.jgit.lib.TextProgressMonitor;
  5. import org.eclipse.jgit.transport.URIish;
  6. import java.io.PrintStream;
  7. import java.io.PrintWriter;
  8. import java.util.Arrays;
  9. import java.util.Collections;
  10. import java.util.List;
  11. public class RemoteHelperDriver implements RemoteHelperContext {
  12. private final Repository repository;
  13. private final URIish uri;
  14. private final PrintWriter out;
  15. private final String remoteName;
  16. private final ProgressMonitor monitor;
  17. private RemoteHelperProvider provider;
  18. public RemoteHelperDriver(Repository repository, URIish uri, String remoteName, PrintWriter out, ProgressMonitor monitor) {
  19. this.repository = repository;
  20. this.uri = uri;
  21. this.remoteName = remoteName;
  22. this.out = out;
  23. this.monitor = monitor;
  24. }
  25. @Override
  26. public void reply(String data) {
  27. out.println(data);
  28. out.flush();
  29. }
  30. @Override
  31. public void complete() {
  32. out.println();
  33. out.flush();
  34. }
  35. @Override
  36. public Repository getRepository() {
  37. return repository;
  38. }
  39. @Override
  40. public String getRemoteName() {
  41. return remoteName;
  42. }
  43. @Override
  44. public URIish getUrl() {
  45. return uri;
  46. }
  47. @Override
  48. public RemoteHelperProvider getProvider() {
  49. return provider;
  50. }
  51. @Override
  52. public void setProvider(RemoteHelperProvider provider) {
  53. this.provider = provider;
  54. }
  55. @Override
  56. public ProgressMonitor getProgressMonitor() {
  57. return monitor;
  58. }
  59. @Override
  60. public void close() {
  61. if (provider != null) {
  62. getProvider().close();
  63. }
  64. }
  65. private RemoteHelperCommand lastCommand;
  66. public void handleLine(String line) throws Exception {
  67. if (provider == null) {
  68. throw new IllegalStateException("Remote Helper Provider was not set.");
  69. }
  70. line = line.trim();
  71. if (line.isEmpty()) {
  72. if (lastCommand != null) {
  73. lastCommand.complete();
  74. lastCommand = null;
  75. }
  76. return;
  77. }
  78. List<String> parts = Arrays.asList(line.split(" "));
  79. String commandName = parts.get(0);
  80. List<String> arguments;
  81. if (parts.size() > 1) {
  82. arguments = parts.subList(1, parts.size());
  83. } else {
  84. arguments = Collections.emptyList();
  85. }
  86. RemoteHelperCommand command = getProvider().getCommand(commandName);
  87. if (command == null) {
  88. command = getDefaultCommand(commandName);
  89. }
  90. if (command == null) {
  91. throw new IllegalArgumentException("Unknown Command: " + line);
  92. }
  93. command.handle(arguments);
  94. if (!command.isBatched()) {
  95. command.complete();
  96. } else {
  97. lastCommand = command;
  98. }
  99. }
  100. public RemoteHelperCommand getDefaultCommand(String name) {
  101. if ("capabilities".equals(name)) {
  102. return new DefaultCapabilitiesCommand(this);
  103. }
  104. return null;
  105. }
  106. private class DefaultCapabilitiesCommand extends RemoteHelperCommand {
  107. public DefaultCapabilitiesCommand(RemoteHelperContext context) {
  108. super(context);
  109. }
  110. @Override
  111. public void handle(List<String> arguments) throws Exception {
  112. for (RemoteHelperCapability capability : getProvider().getCapabilities()) {
  113. String line = capability.getName();
  114. if (capability.hasData()) {
  115. line += " " + capability.getData();
  116. }
  117. getContext().reply(line);
  118. }
  119. getContext().complete();
  120. }
  121. }
  122. }