Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Initial commit.:

  • Loading branch information...
commit 2b347fb8371f0fc7644e393fc8b1d662532811c1 0 parents
Stephen Haberman authored December 22, 2008

Showing 27 changed files with 1,407 additions and 0 deletions. Show diff stats Hide diff stats

  1. 124  .classpath
  2. 1  .gitignore
  3. 13  .project
  4. 319  .settings/org.eclipse.jdt.core.prefs
  5. 56  .settings/org.eclipse.jdt.ui.prefs
  6. 25  README.markdown
  7. 22  pom.xml
  8. 110  src/main/java/hudson/plugins/git/GitAPI.java
  9. 45  src/main/java/hudson/plugins/git/GitChangeLogParser.java
  10. 155  src/main/java/hudson/plugins/git/GitChangeSet.java
  11. 40  src/main/java/hudson/plugins/git/GitChangeSetList.java
  12. 67  src/main/java/hudson/plugins/git/GitLastHashProperty.java
  13. 217  src/main/java/hudson/plugins/git/GitSCM.java
  14. 22  src/main/java/hudson/plugins/git/PluginImpl.java
  15. 63  src/main/java/hudson/plugins/git/browser/GitWeb.java
  16. 31  src/main/resources/hudson/plugins/git/GitChangeSetList/digest.jelly
  17. 39  src/main/resources/hudson/plugins/git/GitChangeSetList/index.jelly
  18. 5  src/main/resources/hudson/plugins/git/GitLastHashProperty/config.jelly
  19. 18  src/main/resources/hudson/plugins/git/GitSCM/config.jelly
  20. 8  src/main/resources/hudson/plugins/git/GitSCM/global.jelly
  21. 5  src/main/resources/hudson/plugins/git/browser/GitWeb/config.jelly
  22. 3  src/main/resources/index.jelly
  23. 3  src/main/webapp/branch.html
  24. 3  src/main/webapp/gitPublisher.html
  25. 3  src/main/webapp/gitweb.html
  26. 3  src/main/webapp/help.html
  27. 7  src/main/webapp/merge.html
124  .classpath
... ...
@@ -0,0 +1,124 @@
  1
+<?xml version="1.0" encoding="UTF-8"?>
  2
+<classpath>
  3
+	<classpathentry kind="src" path="src/main/java"/>
  4
+	<classpathentry excluding="**/*.java" kind="src" path="src/main/resources"/>
  5
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
  6
+	<classpathentry kind="var" path="M2_REPO/org/acegisecurity/acegi-security/1.0.5/acegi-security-1.0.5.jar" sourcepath="M2_REPO/org/acegisecurity/acegi-security/1.0.5/acegi-security-1.0.5-sources.jar"/>
  7
+	<classpathentry kind="var" path="M2_REPO/javax/activation/activation/1.1/activation-1.1.jar" sourcepath="M2_REPO/javax/activation/activation/1.1/activation-1.1-sources.jar"/>
  8
+	<classpathentry kind="var" path="M2_REPO/org/apache/ant/ant/1.7.0/ant-1.7.0.jar" sourcepath="M2_REPO/org/apache/ant/ant/1.7.0/ant-1.7.0-sources.jar"/>
  9
+	<classpathentry kind="var" path="M2_REPO/org/apache/ant/ant-junit/1.7.0/ant-junit-1.7.0.jar"/>
  10
+	<classpathentry kind="var" path="M2_REPO/org/apache/ant/ant-launcher/1.7.0/ant-launcher-1.7.0.jar"/>
  11
+	<classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar" sourcepath="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6-sources.jar"/>
  12
+	<classpathentry kind="var" path="M2_REPO/aopalliance/aopalliance/1.0/aopalliance-1.0.jar" sourcepath="M2_REPO/aopalliance/aopalliance/1.0/aopalliance-1.0-sources.jar"/>
  13
+	<classpathentry kind="var" path="M2_REPO/asm/asm/2.2/asm-2.2.jar"/>
  14
+	<classpathentry kind="var" path="M2_REPO/asm/asm-analysis/2.2/asm-analysis-2.2.jar"/>
  15
+	<classpathentry kind="var" path="M2_REPO/asm/asm-tree/2.2/asm-tree-2.2.jar"/>
  16
+	<classpathentry kind="var" path="M2_REPO/asm/asm-util/2.2/asm-util-2.2.jar"/>
  17
+	<classpathentry kind="var" path="M2_REPO/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar"/>
  18
+	<classpathentry kind="var" path="M2_REPO/classworlds/classworlds/1.1/classworlds-1.1.jar" sourcepath="M2_REPO/classworlds/classworlds/1.1/classworlds-1.1-sources.jar"/>
  19
+	<classpathentry kind="var" path="M2_REPO/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar" sourcepath="M2_REPO/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0-sources.jar"/>
  20
+	<classpathentry kind="var" path="M2_REPO/commons-cli/commons-cli/1.0/commons-cli-1.0.jar" sourcepath="M2_REPO/commons-cli/commons-cli/1.0/commons-cli-1.0-sources.jar"/>
  21
+	<classpathentry kind="var" path="M2_REPO/commons-codec/commons-codec/1.3/commons-codec-1.3.jar" sourcepath="M2_REPO/commons-codec/commons-codec/1.3/commons-codec-1.3-sources.jar"/>
  22
+	<classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.2/commons-collections-3.2.jar" sourcepath="M2_REPO/commons-collections/commons-collections/3.2/commons-collections-3.2-sources.jar"/>
  23
+	<classpathentry kind="var" path="M2_REPO/commons-digester/commons-digester/1.7/commons-digester-1.7.jar" sourcepath="M2_REPO/commons-digester/commons-digester/1.7/commons-digester-1.7-sources.jar"/>
  24
+	<classpathentry kind="var" path="M2_REPO/commons-fileupload/commons-fileupload/1.1/commons-fileupload-1.1.jar" sourcepath="M2_REPO/commons-fileupload/commons-fileupload/1.1/commons-fileupload-1.1-sources.jar"/>
  25
+	<classpathentry kind="var" path="M2_REPO/commons-httpclient/commons-httpclient/3.1-rc1/commons-httpclient-3.1-rc1.jar"/>
  26
+	<classpathentry kind="var" path="M2_REPO/commons-io/commons-io/1.3.1/commons-io-1.3.1.jar" sourcepath="M2_REPO/commons-io/commons-io/1.3.1/commons-io-1.3.1-sources.jar"/>
  27
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/hudson/commons-jelly/1.1-hudson-20071224/commons-jelly-1.1-hudson-20071224.jar" sourcepath="M2_REPO/org/jvnet/hudson/commons-jelly/1.1-hudson-20071224/commons-jelly-1.1-hudson-20071224-sources.jar"/>
  28
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/hudson/commons-jelly-tags-define/1.0.1-hudson-20071021/commons-jelly-tags-define-1.0.1-hudson-20071021.jar"/>
  29
+	<classpathentry kind="var" path="M2_REPO/commons-jelly/commons-jelly-tags-fmt/1.0/commons-jelly-tags-fmt-1.0.jar"/>
  30
+	<classpathentry kind="var" path="M2_REPO/commons-jelly/commons-jelly-tags-xml/1.1/commons-jelly-tags-xml-1.1.jar"/>
  31
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/hudson/commons-jexl/1.1-hudson-20071129/commons-jexl-1.1-hudson-20071129.jar" sourcepath="M2_REPO/org/jvnet/hudson/commons-jexl/1.1-hudson-20071129/commons-jexl-1.1-hudson-20071129-sources.jar"/>
  32
+	<classpathentry kind="var" path="M2_REPO/commons-lang/commons-lang/2.1/commons-lang-2.1.jar" sourcepath="M2_REPO/commons-lang/commons-lang/2.1/commons-lang-2.1-sources.jar"/>
  33
+	<classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar" sourcepath="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1-sources.jar"/>
  34
+	<classpathentry kind="var" path="M2_REPO/commons-pool/commons-pool/1.3/commons-pool-1.3.jar"/>
  35
+	<classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.5/dom4j-1.5.jar"/>
  36
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/hudson/dom4j/dom4j/1.6.1-hudson-1/dom4j-1.6.1-hudson-1.jar" sourcepath="M2_REPO/org/jvnet/hudson/dom4j/dom4j/1.6.1-hudson-1/dom4j-1.6.1-hudson-1-sources.jar"/>
  37
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/doxia/doxia-sink-api/1.0-alpha-10/doxia-sink-api-1.0-alpha-10.jar" sourcepath="M2_REPO/org/apache/maven/doxia/doxia-sink-api/1.0-alpha-10/doxia-sink-api-1.0-alpha-10-sources.jar"/>
  38
+	<classpathentry kind="var" path="M2_REPO/net/sf/ezmorph/ezmorph/1.0.3/ezmorph-1.0.3.jar" sourcepath="M2_REPO/net/sf/ezmorph/ezmorph/1.0.3/ezmorph-1.0.3-sources.jar"/>
  39
+	<classpathentry kind="var" path="M2_REPO/org/kohsuke/graph-layouter/1.0/graph-layouter-1.0-jdk14.jar"/>
  40
+	<classpathentry kind="var" path="M2_REPO/org/codehaus/groovy/groovy/1.1-rc-2/groovy-1.1-rc-2.jar" sourcepath="M2_REPO/org/codehaus/groovy/groovy/1.1-rc-2/groovy-1.1-rc-2-sources.jar"/>
  41
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/hudson/main/hudson-core/1.235/hudson-core-1.235.jar" sourcepath="M2_REPO/org/jvnet/hudson/main/hudson-core/1.235/hudson-core-1.235-sources.jar"/>
  42
+	<classpathentry kind="var" path="M2_REPO/com/ibm/icu/icu4j/2.6.1/icu4j-2.6.1.jar"/>
  43
+	<classpathentry kind="var" path="M2_REPO/jaxen/jaxen/1.1-beta-11/jaxen-1.1-beta-11.jar"/>
  44
+	<classpathentry kind="var" path="M2_REPO/jaxme/jaxme-api/0.3/jaxme-api-0.3.jar"/>
  45
+	<classpathentry kind="var" path="M2_REPO/com/octo/captcha/jcaptcha-all/1.0-RC6/jcaptcha-all-1.0-RC6.jar"/>
  46
+	<classpathentry kind="var" path="M2_REPO/jfree/jcommon/1.0.12/jcommon-1.0.12.jar" sourcepath="M2_REPO/jfree/jcommon/1.0.12/jcommon-1.0.12-sources.jar"/>
  47
+	<classpathentry kind="var" path="M2_REPO/jdom/jdom/1.0/jdom-1.0.jar" sourcepath="M2_REPO/jdom/jdom/1.0/jdom-1.0-sources.jar"/>
  48
+	<classpathentry kind="var" path="M2_REPO/jfree/jfreechart/1.0.9/jfreechart-1.0.9.jar" sourcepath="M2_REPO/jfree/jfreechart/1.0.9/jfreechart-1.0.9-sources.jar"/>
  49
+	<classpathentry kind="var" path="M2_REPO/jline/jline/0.9.91/jline-0.9.91.jar" sourcepath="M2_REPO/jline/jline/0.9.91/jline-0.9.91-sources.jar"/>
  50
+	<classpathentry kind="var" path="M2_REPO/net/java/dev/jna/jna/3.0.3-patch-1/jna-3.0.3-patch-1.jar" sourcepath="M2_REPO/net/java/dev/jna/jna/3.0.3-patch-1/jna-3.0.3-patch-1-sources.jar"/>
  51
+	<classpathentry kind="var" path="M2_REPO/com/jcraft/jsch/0.1.27/jsch-0.1.27.jar" sourcepath="M2_REPO/com/jcraft/jsch/0.1.27/jsch-0.1.27-sources.jar"/>
  52
+	<classpathentry kind="var" path="M2_REPO/org/kohsuke/stapler/json-lib/2.1/json-lib-2.1-jdk15.jar" sourcepath="M2_REPO/org/kohsuke/stapler/json-lib/2.1/json-lib-2.1-jdk15-sources.jar"/>
  53
+	<classpathentry kind="var" path="M2_REPO/javax/xml/jsr173/1.0/jsr173-1.0.jar"/>
  54
+	<classpathentry kind="var" path="M2_REPO/javax/servlet/jstl/1.1.0/jstl-1.1.0.jar"/>
  55
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/hudson/jtidy/4aug2000r7-dev-hudson-1/jtidy-4aug2000r7-dev-hudson-1.jar" sourcepath="M2_REPO/org/jvnet/hudson/jtidy/4aug2000r7-dev-hudson-1/jtidy-4aug2000r7-dev-hudson-1-sources.jar"/>
  56
+	<classpathentry kind="var" path="M2_REPO/junit/junit/4.3.1/junit-4.3.1.jar" sourcepath="M2_REPO/junit/junit/4.3.1/junit-4.3.1-sources.jar"/>
  57
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/localizer/localizer/1.5/localizer-1.5.jar" sourcepath="M2_REPO/org/jvnet/localizer/localizer/1.5/localizer-1.5-sources.jar"/>
  58
+	<classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.9/log4j-1.2.9.jar" sourcepath="M2_REPO/log4j/log4j/1.2.9/log4j-1.2.9-sources.jar"/>
  59
+	<classpathentry kind="var" path="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1.jar" sourcepath="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1-sources.jar"/>
  60
+	<classpathentry kind="var" path="M2_REPO/javax/mail/mail/1.4/mail-1.4.jar" sourcepath="M2_REPO/javax/mail/mail/1.4/mail-1.4-sources.jar"/>
  61
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/hudson/main/maven-agent/1.235/maven-agent-1.235.jar" sourcepath="M2_REPO/org/jvnet/hudson/main/maven-agent/1.235/maven-agent-1.235-sources.jar"/>
  62
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-artifact/2.0.9/maven-artifact-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/maven-artifact/2.0.9/maven-artifact-2.0.9-sources.jar"/>
  63
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-artifact-manager/2.0.9/maven-artifact-manager-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/maven-artifact-manager/2.0.9/maven-artifact-manager-2.0.9-sources.jar"/>
  64
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-core/2.0.9/maven-core-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/maven-core/2.0.9/maven-core-2.0.9-sources.jar"/>
  65
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-embedder/2.0.4/maven-embedder-2.0.4.jar" sourcepath="M2_REPO/org/apache/maven/maven-embedder/2.0.4/maven-embedder-2.0.4-sources.jar"/>
  66
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-error-diagnostics/2.0.9/maven-error-diagnostics-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/maven-error-diagnostics/2.0.9/maven-error-diagnostics-2.0.9-sources.jar"/>
  67
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/hudson/main/maven-interceptor/1.235/maven-interceptor-1.235.jar" sourcepath="M2_REPO/org/jvnet/hudson/main/maven-interceptor/1.235/maven-interceptor-1.235-sources.jar"/>
  68
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-model/2.0.9/maven-model-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/maven-model/2.0.9/maven-model-2.0.9-sources.jar"/>
  69
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-monitor/2.0.9/maven-monitor-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/maven-monitor/2.0.9/maven-monitor-2.0.9-sources.jar"/>
  70
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-plugin-api/2.0.9/maven-plugin-api-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/maven-plugin-api/2.0.9/maven-plugin-api-2.0.9-sources.jar"/>
  71
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-plugin-descriptor/2.0.9/maven-plugin-descriptor-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/maven-plugin-descriptor/2.0.9/maven-plugin-descriptor-2.0.9-sources.jar"/>
  72
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-plugin-parameter-documenter/2.0.9/maven-plugin-parameter-documenter-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/maven-plugin-parameter-documenter/2.0.9/maven-plugin-parameter-documenter-2.0.9-sources.jar"/>
  73
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-plugin-registry/2.0.9/maven-plugin-registry-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/maven-plugin-registry/2.0.9/maven-plugin-registry-2.0.9-sources.jar"/>
  74
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-profile/2.0.9/maven-profile-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/maven-profile/2.0.9/maven-profile-2.0.9-sources.jar"/>
  75
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-project/2.0.9/maven-project-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/maven-project/2.0.9/maven-project-2.0.9-sources.jar"/>
  76
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/reporting/maven-reporting-api/2.0.9/maven-reporting-api-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/reporting/maven-reporting-api/2.0.9/maven-reporting-api-2.0.9-sources.jar"/>
  77
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-repository-metadata/2.0.9/maven-repository-metadata-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/maven-repository-metadata/2.0.9/maven-repository-metadata-2.0.9-sources.jar"/>
  78
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-settings/2.0.9/maven-settings-2.0.9.jar" sourcepath="M2_REPO/org/apache/maven/maven-settings/2.0.9/maven-settings-2.0.9-sources.jar"/>
  79
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/hudson/memory-monitor/1.1/memory-monitor-1.1.jar" sourcepath="M2_REPO/org/jvnet/hudson/memory-monitor/1.1/memory-monitor-1.1-sources.jar"/>
  80
+	<classpathentry kind="var" path="M2_REPO/oro/oro/2.0.8/oro-2.0.8.jar" sourcepath="M2_REPO/oro/oro/2.0.8/oro-2.0.8-sources.jar"/>
  81
+	<classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-container-default/1.0-alpha-9-stable-1/plexus-container-default-1.0-alpha-9-stable-1.jar" sourcepath="M2_REPO/org/codehaus/plexus/plexus-container-default/1.0-alpha-9-stable-1/plexus-container-default-1.0-alpha-9-stable-1-sources.jar"/>
  82
+	<classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-interactivity-api/1.0-alpha-4/plexus-interactivity-api-1.0-alpha-4.jar" sourcepath="M2_REPO/org/codehaus/plexus/plexus-interactivity-api/1.0-alpha-4/plexus-interactivity-api-1.0-alpha-4-sources.jar"/>
  83
+	<classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-utils/1.5.1/plexus-utils-1.5.1.jar"/>
  84
+	<classpathentry kind="var" path="M2_REPO/pull-parser/pull-parser/2/pull-parser-2.jar"/>
  85
+	<classpathentry kind="var" path="M2_REPO/msv/relaxngDatatype/20030807/relaxngDatatype-20030807.jar"/>
  86
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/hudson/main/remoting/1.235/remoting-1.235.jar" sourcepath="M2_REPO/org/jvnet/hudson/main/remoting/1.235/remoting-1.235-sources.jar"/>
  87
+	<classpathentry kind="var" path="M2_REPO/javax/servlet/servlet-api/2.4/servlet-api-2.4.jar" sourcepath="M2_REPO/javax/servlet/servlet-api/2.4/servlet-api-2.4-sources.jar"/>
  88
+	<classpathentry kind="var" path="M2_REPO/slide/slide-webdavlib/2.1/slide-webdavlib-2.1.jar" sourcepath="M2_REPO/slide/slide-webdavlib/2.1/slide-webdavlib-2.1-sources.jar"/>
  89
+	<classpathentry kind="var" path="M2_REPO/org/springframework/spring-beans/2.5/spring-beans-2.5.jar" sourcepath="M2_REPO/org/springframework/spring-beans/2.5/spring-beans-2.5-sources.jar"/>
  90
+	<classpathentry kind="var" path="M2_REPO/org/springframework/spring-context/2.5/spring-context-2.5.jar" sourcepath="M2_REPO/org/springframework/spring-context/2.5/spring-context-2.5-sources.jar"/>
  91
+	<classpathentry kind="var" path="M2_REPO/org/springframework/spring-core/2.5/spring-core-2.5.jar" sourcepath="M2_REPO/org/springframework/spring-core/2.5/spring-core-2.5-sources.jar"/>
  92
+	<classpathentry kind="var" path="M2_REPO/org/springframework/spring-dao/1.2.9/spring-dao-1.2.9.jar"/>
  93
+	<classpathentry kind="var" path="M2_REPO/org/springframework/spring-jdbc/1.2.9/spring-jdbc-1.2.9.jar"/>
  94
+	<classpathentry kind="var" path="M2_REPO/org/springframework/spring-support/1.2.9/spring-support-1.2.9.jar"/>
  95
+	<classpathentry kind="var" path="M2_REPO/org/springframework/spring-web/2.5/spring-web-2.5.jar" sourcepath="M2_REPO/org/springframework/spring-web/2.5/spring-web-2.5-sources.jar"/>
  96
+	<classpathentry kind="var" path="M2_REPO/org/kohsuke/stapler/stapler/1.79/stapler-1.79.jar" sourcepath="M2_REPO/org/kohsuke/stapler/stapler/1.79/stapler-1.79-sources.jar"/>
  97
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/hudson/svnkit/svnkit/1.1.7-hudson-3/svnkit-1.1.7-hudson-3.jar" sourcepath="M2_REPO/org/jvnet/hudson/svnkit/svnkit/1.1.7-hudson-3/svnkit-1.1.7-hudson-3-sources.jar"/>
  98
+	<classpathentry kind="var" path="M2_REPO/org/ccil/cowan/tagsoup/tagsoup/0.9.7/tagsoup-0.9.7.jar"/>
  99
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/tiger-types/1.0/tiger-types-1.0.jar" sourcepath="M2_REPO/org/jvnet/tiger-types/1.0/tiger-types-1.0-sources.jar"/>
  100
+	<classpathentry kind="var" path="M2_REPO/org/kohsuke/trilead-putty-extension/1.0/trilead-putty-extension-1.0.jar" sourcepath="M2_REPO/org/kohsuke/trilead-putty-extension/1.0/trilead-putty-extension-1.0-sources.jar"/>
  101
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/hudson/trilead-ssh2/build212-hudson-1/trilead-ssh2-build212-hudson-1.jar" sourcepath="M2_REPO/org/jvnet/hudson/trilead-ssh2/build212-hudson-1/trilead-ssh2-build212-hudson-1-sources.jar"/>
  102
+	<classpathentry kind="var" path="M2_REPO/com/sun/xml/txw2/txw2/20070624/txw2-20070624.jar" sourcepath="M2_REPO/com/sun/xml/txw2/txw2/20070624/txw2-20070624-sources.jar"/>
  103
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-file/1.0-beta-2/wagon-file-1.0-beta-2.jar" sourcepath="M2_REPO/org/apache/maven/wagon/wagon-file/1.0-beta-2/wagon-file-1.0-beta-2-sources.jar"/>
  104
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-http-lightweight/1.0-beta-2/wagon-http-lightweight-1.0-beta-2.jar" sourcepath="M2_REPO/org/apache/maven/wagon/wagon-http-lightweight/1.0-beta-2/wagon-http-lightweight-1.0-beta-2-sources.jar"/>
  105
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-http-shared/1.0-beta-2/wagon-http-shared-1.0-beta-2.jar" sourcepath="M2_REPO/org/apache/maven/wagon/wagon-http-shared/1.0-beta-2/wagon-http-shared-1.0-beta-2-sources.jar"/>
  106
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.jar" sourcepath="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2-sources.jar"/>
  107
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-ssh/1.0-beta-2/wagon-ssh-1.0-beta-2.jar" sourcepath="M2_REPO/org/apache/maven/wagon/wagon-ssh/1.0-beta-2/wagon-ssh-1.0-beta-2-sources.jar"/>
  108
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-ssh-common/1.0-beta-2/wagon-ssh-common-1.0-beta-2.jar" sourcepath="M2_REPO/org/apache/maven/wagon/wagon-ssh-common/1.0-beta-2/wagon-ssh-common-1.0-beta-2-sources.jar"/>
  109
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-ssh-external/1.0-beta-2/wagon-ssh-external-1.0-beta-2.jar" sourcepath="M2_REPO/org/apache/maven/wagon/wagon-ssh-external/1.0-beta-2/wagon-ssh-external-1.0-beta-2-sources.jar"/>
  110
+	<classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-webdav/1.0-beta-2/wagon-webdav-1.0-beta-2.jar" sourcepath="M2_REPO/org/apache/maven/wagon/wagon-webdav/1.0-beta-2/wagon-webdav-1.0-beta-2-sources.jar"/>
  111
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/hudson/wagon-webdav/1.0-beta-2-hudson-1/wagon-webdav-1.0-beta-2-hudson-1.jar" sourcepath="M2_REPO/org/jvnet/hudson/wagon-webdav/1.0-beta-2-hudson-1/wagon-webdav-1.0-beta-2-hudson-1-sources.jar"/>
  112
+	<classpathentry kind="var" path="M2_REPO/org/jvnet/winp/winp/1.5/winp-1.5.jar" sourcepath="M2_REPO/org/jvnet/winp/winp/1.5/winp-1.5-sources.jar"/>
  113
+	<classpathentry kind="var" path="M2_REPO/xalan/xalan/2.3.1/xalan-2.3.1.jar"/>
  114
+	<classpathentry kind="var" path="M2_REPO/xerces/xercesImpl/2.6.2/xercesImpl-2.6.2.jar" sourcepath="M2_REPO/xerces/xercesImpl/2.6.2/xercesImpl-2.6.2-sources.jar"/>
  115
+	<classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2.jar" sourcepath="M2_REPO/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2-sources.jar"/>
  116
+	<classpathentry kind="var" path="M2_REPO/de/zeigermann/xml/xml-im-exporter/1.1/xml-im-exporter-1.1.jar"/>
  117
+	<classpathentry kind="var" path="M2_REPO/xerces/xmlParserAPIs/2.6.1/xmlParserAPIs-2.6.1.jar"/>
  118
+	<classpathentry kind="var" path="M2_REPO/xom/xom/1.0b3/xom-1.0b3.jar"/>
  119
+	<classpathentry kind="var" path="M2_REPO/xpp3/xpp3/1.1.3.3/xpp3-1.1.3.3.jar"/>
  120
+	<classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar" sourcepath="M2_REPO/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c-sources.jar"/>
  121
+	<classpathentry kind="var" path="M2_REPO/msv/xsdlib/20030807/xsdlib-20030807.jar"/>
  122
+	<classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.3/xstream-1.3.jar" sourcepath="M2_REPO/com/thoughtworks/xstream/xstream/1.3/xstream-1.3-sources.jar"/>
  123
+	<classpathentry kind="output" path="target/classes"/>
  124
+</classpath>
1  .gitignore
... ...
@@ -0,0 +1 @@
  1
+target
13  .project
... ...
@@ -0,0 +1,13 @@
  1
+<projectDescription>
  2
+  <name>git2</name>
  3
+  <comment>Integrates Hudson to GIT SCM--without starvation</comment>
  4
+  <projects/>
  5
+  <buildSpec>
  6
+    <buildCommand>
  7
+      <name>org.eclipse.jdt.core.javabuilder</name>
  8
+    </buildCommand>
  9
+  </buildSpec>
  10
+  <natures>
  11
+    <nature>org.eclipse.jdt.core.javanature</nature>
  12
+  </natures>
  13
+</projectDescription>
319  .settings/org.eclipse.jdt.core.prefs
... ...
@@ -0,0 +1,319 @@
  1
+#Thu Oct 16 15:49:48 CDT 2008
  2
+eclipse.preferences.version=1
  3
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
  4
+org.eclipse.jdt.core.compiler.compliance=1.5
  5
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
  6
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
  7
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
  8
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
  9
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
  10
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
  11
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
  12
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
  13
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
  14
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
  15
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
  16
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
  17
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
  18
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
  19
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
  20
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
  21
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
  22
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
  23
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
  24
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
  25
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
  26
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
  27
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
  28
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
  29
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
  30
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
  31
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
  32
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
  33
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
  34
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
  35
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
  36
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
  37
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
  38
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
  39
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
  40
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
  41
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
  42
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
  43
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
  44
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
  45
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
  46
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
  47
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
  48
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
  49
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
  50
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
  51
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
  52
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
  53
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
  54
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
  55
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
  56
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
  57
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
  58
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
  59
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
  60
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
  61
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
  62
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
  63
+org.eclipse.jdt.core.compiler.source=1.5
  64
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
  65
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
  66
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
  67
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
  68
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
  69
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
  70
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
  71
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
  72
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
  73
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
  74
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
  75
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
  76
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
  77
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
  78
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
  79
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
  80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
  81
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
  82
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
  83
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
  84
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
  85
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
  86
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
  87
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
  88
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
  89
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
  90
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
  91
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
  92
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
  93
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
  94
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
  95
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
  96
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
  97
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
  98
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
  99
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
  100
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
  101
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
  102
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
  103
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
  104
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
  105
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
  106
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
  107
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
  108
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
  109
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
  110
+org.eclipse.jdt.core.formatter.comment.format_header=false
  111
+org.eclipse.jdt.core.formatter.comment.format_html=true
  112
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
  113
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
  114
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
  115
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
  116
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
  117
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
  118
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
  119
+org.eclipse.jdt.core.formatter.comment.line_length=80
  120
+org.eclipse.jdt.core.formatter.compact_else_if=true
  121
+org.eclipse.jdt.core.formatter.continuation_indentation=2
  122
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
  123
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
  124
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
  125
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
  126
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
  127
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
  128
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
  129
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
  130
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
  131
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
  132
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
  133
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
  134
+org.eclipse.jdt.core.formatter.indentation.size=4
  135
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
  136
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
  137
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
  138
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
  139
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
  140
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
  141
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
  142
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
  143
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
  144
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
  145
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
  146
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
  147
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
  148
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
  149
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
  150
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
  151
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
  152
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
  153
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
  154
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
  155
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
  156
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
  157
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
  158
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
  159
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
  160
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
  161
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
  162
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
  163
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
  164
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
  165
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
  166
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
  167
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
  168
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
  169
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
  170
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
  171
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
  172
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
  173
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
  174
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
  175
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
  176
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
  177
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
  178
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
  179
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
  180
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
  181
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
  182
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
  183
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
  184
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
  185
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
  186
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
  187
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
  188
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
  189
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
  190
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
  191
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
  192
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
  193
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
  194
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
  195
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
  196
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
  197
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
  198
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
  199
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
  200
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
  201
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
  202
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
  203
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
  204
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
  205
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
  206
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
  207
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
  208
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
  209
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
  210
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
  211
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
  212
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
  213
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
  214
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
  215
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
  216
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
  217
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
  218
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
  219
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
  220
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
  221
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
  222
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
  223
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
  224
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
  225
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
  226
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
  227
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
  228
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
  229
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
  230
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
  231
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
  232
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
  233
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
  234
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
  235
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
  236
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
  237
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
  238
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
  239
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
  240
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
  241
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
  242
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
  243
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
  244
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
  245
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
  246
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
  247
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
  248
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
  249
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
  250
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
  251
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
  252
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
  253
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
  254
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
  255
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
  256
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
  257
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
  258
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
  259
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
  260
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
  261
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
  262
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
  263
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
  264
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
  265
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
  266
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
  267
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
  268
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
  269
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
  270
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
  271
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
  272
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
  273
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
  274
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
  275
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
  276
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
  277
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
  278
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
  279
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
  280
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
  281
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
  282
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
  283
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
  284
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
  285
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
  286
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
  287
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
  288
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
  289
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
  290
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
  291
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
  292
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
  293
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
  294
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
  295
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
  296
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
  297
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
  298
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
  299
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
  300
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
  301
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
  302
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
  303
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
  304
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
  305
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
  306
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
  307
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
  308
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
  309
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
  310
+org.eclipse.jdt.core.formatter.lineSplit=120
  311
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
  312
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
  313
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
  314
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
  315
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
  316
+org.eclipse.jdt.core.formatter.tabulation.char=tab
  317
+org.eclipse.jdt.core.formatter.tabulation.size=4
  318
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
  319
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
56  .settings/org.eclipse.jdt.ui.prefs
... ...
@@ -0,0 +1,56 @@
  1
+#Thu Oct 16 15:49:48 CDT 2008
  2
+eclipse.preferences.version=1
  3
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
  4
+formatter_profile=_Foo
  5
+formatter_settings_version=11
  6
+sp_cleanup.add_default_serial_version_id=true
  7
+sp_cleanup.add_generated_serial_version_id=false
  8
+sp_cleanup.add_missing_annotations=false
  9
+sp_cleanup.add_missing_deprecated_annotations=true
  10
+sp_cleanup.add_missing_methods=false
  11
+sp_cleanup.add_missing_nls_tags=false
  12
+sp_cleanup.add_missing_override_annotations=true
  13
+sp_cleanup.add_serial_version_id=false
  14
+sp_cleanup.always_use_blocks=true
  15
+sp_cleanup.always_use_parentheses_in_expressions=true
  16
+sp_cleanup.always_use_this_for_non_static_field_access=true
  17
+sp_cleanup.always_use_this_for_non_static_method_access=true
  18
+sp_cleanup.convert_to_enhanced_for_loop=false
  19
+sp_cleanup.correct_indentation=true
  20
+sp_cleanup.format_source_code=true
  21
+sp_cleanup.format_source_code_changes_only=false
  22
+sp_cleanup.make_local_variable_final=false
  23
+sp_cleanup.make_parameters_final=false
  24
+sp_cleanup.make_private_fields_final=true
  25
+sp_cleanup.make_type_abstract_if_missing_method=false
  26
+sp_cleanup.make_variable_declarations_final=false
  27
+sp_cleanup.never_use_blocks=false
  28
+sp_cleanup.never_use_parentheses_in_expressions=false
  29
+sp_cleanup.on_save_use_additional_actions=true
  30
+sp_cleanup.organize_imports=true
  31
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=true
  32
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
  33
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
  34
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
  35
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=true
  36
+sp_cleanup.remove_private_constructors=true
  37
+sp_cleanup.remove_trailing_whitespaces=true
  38
+sp_cleanup.remove_trailing_whitespaces_all=true
  39
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
  40
+sp_cleanup.remove_unnecessary_casts=true
  41
+sp_cleanup.remove_unnecessary_nls_tags=false
  42
+sp_cleanup.remove_unused_imports=true
  43
+sp_cleanup.remove_unused_local_variables=false
  44
+sp_cleanup.remove_unused_private_fields=true
  45
+sp_cleanup.remove_unused_private_members=false
  46
+sp_cleanup.remove_unused_private_methods=true
  47
+sp_cleanup.remove_unused_private_types=true
  48
+sp_cleanup.sort_members=false
  49
+sp_cleanup.sort_members_all=false
  50
+sp_cleanup.use_blocks=true
  51
+sp_cleanup.use_blocks_only_for_return_and_throw=false
  52
+sp_cleanup.use_parentheses_in_expressions=true
  53
+sp_cleanup.use_this_for_non_static_field_access=true
  54
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=false
  55
+sp_cleanup.use_this_for_non_static_method_access=true
  56
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=false
25  README.markdown
Source Rendered
... ...
@@ -0,0 +1,25 @@
  1
+
  2
+Install
  3
+=======
  4
+
  5
+* Upload target/git.hpi to your instance of Hudson
  6
+* Choose Git as your SCM for your project
  7
+
  8
+That's all I remember as I don't have a Hudson instance in front of me.
  9
+
  10
+Building
  11
+========
  12
+
  13
+* This plugin expects to live in the `hudson/plugins/git2` directory of a Hudson svn checkout
  14
+* Then just run `mvn` from the `git2` directory
  15
+
  16
+Notes
  17
+=====
  18
+
  19
+* The merge into other branches option is about the only code left over from the original git plugin and I haven't personally used it--it may or may not work
  20
+
  21
+Acknowledgements
  22
+================
  23
+
  24
+* The original Hudson git plugin author for providing a great place to start copy/pasting from
  25
+
22  pom.xml
... ...
@@ -0,0 +1,22 @@
  1
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  2
+  <modelVersion>4.0.0</modelVersion>
  3
+  <parent>
  4
+    <groupId>org.jvnet.hudson.plugins</groupId>
  5
+    <artifactId>plugin</artifactId>
  6
+    <version>1.235</version>
  7
+    <relativePath>../pom.xml</relativePath>
  8
+  </parent>
  9
+
  10
+  <artifactId>git</artifactId>
  11
+  <version>1.0-SNAPSHOT</version>
  12
+  <packaging>hpi</packaging>
  13
+  <name>Hudson GIT plugin</name>
  14
+  <description>Integrates Hudson to GIT SCM</description>
  15
+  <url>http://hudson.gotdns.com/wiki/display/HUDSON/Git+Plugin</url>
  16
+
  17
+  <scm>
  18
+    <connection>scm:svn:https://guest@svn.dev.java.net/svn/hudson/tags/git-0.1</connection>
  19
+    <developerConnection>scm:svn:https://svn.dev.java.net/svn/hudson/tags/git-0.1</developerConnection>
  20
+    <url>https://hudson.dev.java.net/source/browse/hudson/hudson/plugins/git/tags/git-0.1</url>
  21
+  </scm>
  22
+</project>
110  src/main/java/hudson/plugins/git/GitAPI.java
... ...
@@ -0,0 +1,110 @@
  1
+package hudson.plugins.git;
  2
+
  3
+import hudson.FilePath;
  4
+import hudson.Launcher;
  5
+import hudson.model.TaskListener;
  6
+import hudson.util.ArgumentListBuilder;
  7
+
  8
+import java.io.ByteArrayOutputStream;
  9
+import java.io.File;
  10
+import java.io.FileOutputStream;
  11
+import java.io.IOException;
  12
+import java.util.HashMap;
  13
+import java.util.Map;
  14
+
  15
+import org.apache.commons.io.FileUtils;
  16
+import org.apache.commons.lang.StringUtils;
  17
+
  18
+public class GitAPI {
  19
+
  20
+	private final String gitExe;
  21
+	private final Launcher launcher;
  22
+	private final FilePath workspace;
  23
+	private final TaskListener listener;
  24
+
  25
+	public GitAPI(GitSCM.DescriptorImpl descriptor, Launcher launcher, FilePath workspace, TaskListener listener) {
  26
+		this.gitExe = descriptor.getGitExe();
  27
+		this.launcher = launcher;
  28
+		this.workspace = workspace;
  29
+		this.listener = listener;
  30
+	}
  31
+
  32
+	public boolean hasGitRepo() throws InterruptedException, IOException {
  33
+		return this.workspace.child(".git").exists();
  34
+	}
  35
+
  36
+	public boolean hasGitModules() throws InterruptedException, IOException {
  37
+		return this.workspace.child(".gitmodules").exists();
  38
+	}
  39
+
  40
+	public String revParse(String revName) throws InterruptedException, IOException {
  41
+		ArgumentListBuilder args = new ArgumentListBuilder();
  42
+		args.add(this.gitExe, "rev-parse", revName.replace(' ', '_'));
  43
+
  44
+		ByteArrayOutputStream fos = new ByteArrayOutputStream();
  45
+		int code = this.launcher.launch(args.toCommandArray(), this.createEnvVarMap(), fos, this.workspace).join();
  46
+		fos.close();
  47
+		if (code != 0) {
  48
+			this.listener.getLogger().println("Error doing rev-parse: " + fos.toString());
  49
+			return null;
  50
+		}
  51
+
  52
+		return StringUtils.trimToNull(fos.toString());
  53
+	}
  54
+
  55
+	public void log(String revFrom, String revTo, File file) throws InterruptedException, IOException {
  56
+		ArgumentListBuilder args = new ArgumentListBuilder();
  57
+		args.add(this.gitExe, "log", "--numstat", "-M", "--summary", "--pretty=raw", revFrom + ".." + revTo);
  58
+
  59
+		file.delete();
  60
+		FileOutputStream fos = new FileOutputStream(file);
  61
+		// fos.write("<data><![CDATA[".getBytes());
  62
+		int code = this.launcher.launch(args.toCommandArray(), this.createEnvVarMap(), fos, this.workspace).join();
  63
+		// fos.write("]]></data>".getBytes());
  64
+		fos.close();
  65
+		if (code != 0) {
  66
+			this.listener.getLogger().print("Error launching git log: " + FileUtils.readFileToString(file));
  67
+			throw new RuntimeException("Error launching git log");
  68
+		}
  69
+	}
  70
+
  71
+	/** Start from scratch and clone the whole repository. */
  72
+	public void clone(String source) throws InterruptedException, IOException {
  73
+		this.workspace.deleteRecursive();
  74
+		this.launch("Failed to clone " + source, this.gitExe, "clone", source, this.workspace.getRemote());
  75
+	}
  76
+
  77
+	public void fetch() throws InterruptedException, IOException {
  78
+		this.launch("Failed to fetch", this.gitExe, "fetch");
  79
+	}
  80
+
  81
+	public void merge(String revSpec) throws InterruptedException, IOException {
  82
+		this.launch("Error in merging " + revSpec, this.gitExe, "merge", revSpec);
  83
+	}
  84
+
  85
+	public void submoduleInit() throws InterruptedException, IOException {
  86
+		this.launch("Error in submodule init", this.gitExe, "submodule", "init");
  87
+	}
  88
+
  89
+	public void submoduleUpdate() throws InterruptedException, IOException {
  90
+		this.launch("Error in submodule update", this.gitExe, "submodule", "update");
  91
+	}
  92
+
  93
+	public void checkout(String ref) throws InterruptedException, IOException {
  94
+		this.launch("Error checking out " + ref, this.gitExe, "checkout", "-f", ref);
  95
+	}
  96
+
  97
+	private void launch(String error, String... args) throws InterruptedException, IOException {
  98
+		int code = this.launcher.launch(args, this.createEnvVarMap(), this.listener.getLogger(),
  99
+				this.workspace.exists() ? this.workspace : null).join();
  100
+		if (code != 0) {
  101
+			throw new RuntimeException(error);
  102
+		}
  103
+	}
  104
+
  105
+	private final Map<String, String> createEnvVarMap() {
  106
+		Map<String, String> env = new HashMap<String, String>();
  107
+		return env;
  108
+	}
  109
+
  110
+}
45  src/main/java/hudson/plugins/git/GitChangeLogParser.java
... ...
@@ -0,0 +1,45 @@
  1
+package hudson.plugins.git;
  2
+
  3
+import hudson.model.AbstractBuild;
  4
+import hudson.scm.ChangeLogParser;
  5
+
  6
+import java.io.BufferedReader;
  7
+import java.io.File;
  8
+import java.io.FileReader;
  9
+import java.io.IOException;
  10
+import java.util.ArrayList;
  11
+import java.util.List;
  12
+
  13
+import org.xml.sax.SAXException;
  14
+
  15
+public class GitChangeLogParser extends ChangeLogParser {
  16
+
  17
+	public GitChangeSetList parse(AbstractBuild build, File changelogFile) throws IOException, SAXException {
  18
+		ArrayList<GitChangeSet> r = new ArrayList<GitChangeSet>();
  19
+
  20
+		// Parse the log file into GitChangeSet items - each one is a commit
  21
+		BufferedReader rdr = new BufferedReader(new FileReader(changelogFile));
  22
+
  23
+		String line;
  24
+		List<String> lines = null;
  25
+		while ((line = rdr.readLine()) != null) {
  26
+			if (line.startsWith("commit ")) {
  27
+				if (lines != null) {
  28
+					r.add(this.parseCommit(lines));
  29
+				}
  30
+				lines = new ArrayList<String>();
  31
+			}
  32
+			lines.add(line);
  33
+		}
  34
+		if (lines != null) {
  35
+			r.add(this.parseCommit(lines));
  36
+		}
  37
+
  38
+		return new GitChangeSetList(build, r);
  39
+	}
  40
+
  41
+	private GitChangeSet parseCommit(List<String> lines) {
  42
+		return new GitChangeSet(lines);
  43
+	}
  44
+
  45
+}
155  src/main/java/hudson/plugins/git/GitChangeSet.java
... ...
@@ -0,0 +1,155 @@
  1
+package hudson.plugins.git;
  2
+
  3
+import hudson.model.User;
  4
+import hudson.scm.ChangeLogSet;
  5
+
  6
+import java.util.Collection;
  7
+import java.util.HashSet;
  8
+import java.util.List;
  9
+
  10
+/**
  11
+ * Represents a change set.
  12
+ *
  13
+ * @author Nigel Magnay
  14
+ */
  15
+public class GitChangeSet extends ChangeLogSet.Entry {
  16
+
  17
+	private Collection<String> affectedPaths = new HashSet<String>();
  18
+	private String author;
  19
+	private String msg;
  20
+	private String id;
  21
+
  22
+	public GitChangeSet(List<String> lines) {
  23
+		if (lines.size() > 0) {
  24
+			this.parseCommit(lines);
  25
+		}
  26
+	}
  27
+
  28
+	private void parseCommit(List<String> lines) {
  29
+		String comment = "";
  30
+
  31
+		for (String line : lines) {
  32
+			if (line.length() > 0) {
  33
+				if (line.startsWith("commit ")) {
  34
+					this.id = line.split(" ")[1];
  35
+				} else if (line.startsWith("tree")) {
  36
+				} else if (line.startsWith("parent")) {
  37
+					// parent
  38
+				} else if (line.startsWith("committer")) {
  39
+
  40
+					this.author = line.substring(10, line.indexOf(" <"));
  41
+
  42
+				} else if (line.startsWith("author ")) {
  43
+
  44
+				} else if (line.startsWith("    ")) {
  45
+					comment += line + "\n";
  46
+				} else {
  47
+
  48
+					if (line.startsWith(" create")) {
  49
+						// " create mode 101010 path"
  50
+						String[] items = line.split(" ");
  51
+
  52
+						String pathString = line.substring(line.indexOf(items[4]));
  53
+						this.affectedPaths.add(pathString);
  54
+					} else if (line.startsWith(" delete")) {
  55
+						// " delete mode 101010 path"
  56
+						String[] items = line.split(" ");
  57
+
  58
+						String pathString = line.substring(line.indexOf(items[4]));
  59
+						this.affectedPaths.add(pathString);
  60
+
  61
+					} else if (line.startsWith(" rename")) {
  62
+						// " rename path (change amount%)"
  63
+						String[] items = line.split(" ");
  64
+						String pathString = line.substring(line.indexOf(items[2]));
  65
+						// remove the trailing percentage
  66
+						pathString = pathString.substring(0, pathString.lastIndexOf(" "));
  67
+
  68
+						String[] paths = this.unsplit(pathString);
  69
+
  70
+						this.affectedPaths.add(paths[0]);
  71
+						this.affectedPaths.add(paths[1]);
  72
+
  73
+					} else if (line.startsWith(" copy")) {
  74
+						// " copy path (change amount%)"
  75
+						String[] items = line.split(" ");
  76
+						String pathString = line.substring(line.indexOf(items[2]));
  77
+
  78
+						// remove the trailing percentage
  79
+						pathString = pathString.substring(0, pathString.lastIndexOf(" "));
  80
+
  81
+						String[] paths = this.unsplit(pathString);
  82
+
  83
+						// only affect the target..
  84
+						this.affectedPaths.add(paths[1]);
  85
+
  86
+					} else if (line.startsWith(" mode")) {
  87
+						// Ignore mode change
  88
+					} else if (line.startsWith(" ")) {
  89
+						throw new RuntimeException("Log contains line that is not expected: " + line);
  90
+					} else {
  91
+						// Ignore
  92
+					}
  93
+
  94
+				}
  95
+			}
  96
+
  97
+		}
  98
+
  99
+		this.msg = comment;
  100
+	}
  101
+
  102
+	public String[] unsplit(String data) {
  103
+		// Given modules/intray/{mergeFiles/WEB-INF/classes =>
  104
+		// src/main/resources/com/nirima}/modules.xml
  105
+		// return the two paths specified
  106
+		try {
  107
+			if (!data.contains("{")) {
  108
+				String left = data.substring(0, data.indexOf(" => "));
  109
+				String right = data.substring(data.indexOf(" => ") + 4);
  110
+				return new String[] { left, right };
  111
+			} else {
  112
+
  113
+				String pre = data.substring(0, data.indexOf('{'));
  114
+				String post = data.substring(data.indexOf('}') + 1);
  115
+
  116
+				String left = data.substring(data.indexOf('{') + 1, data.indexOf(" => "));
  117
+				String right = data.substring(data.indexOf(" => ") + 4, data.indexOf("}"));
  118
+
  119
+				String leftItem = pre + left + post;
  120
+				String rightItem = pre + right + post;
  121
+
  122
+				// Special - repace any // with /
  123
+				leftItem = leftItem.replaceAll("//", "/");
  124
+				rightItem = rightItem.replaceAll("//", "/");
  125
+				return new String[] { leftItem, rightItem };
  126
+			}
  127
+		} catch (Exception ex) {
  128
+			throw new RuntimeException(ex);
  129
+		}
  130
+	}
  131
+
  132
+	public void setParent(ChangeLogSet parent) {
  133
+		super.setParent(parent);
  134
+	}
  135
+
  136
+	@Override
  137
+	public Collection<String> getAffectedPaths() {
  138
+		return this.affectedPaths;
  139
+	}
  140
+
  141
+	@Override
  142
+	public User getAuthor() {
  143
+		return User.get(this.author, true);
  144
+	}
  145
+
  146
+	@Override
  147
+	public String getMsg() {
  148
+		return this.msg;
  149
+	}
  150
+
  151
+	public String getId() {
  152
+		return this.id;
  153
+	}
  154
+
  155
+}
40  src/main/java/hudson/plugins/git/GitChangeSetList.java
... ...
@@ -0,0 +1,40 @@
  1
+package hudson.plugins.git;
  2
+
  3
+import hudson.model.AbstractBuild;
  4
+import hudson.scm.ChangeLogSet;
  5
+
  6
+import java.util.Collections;
  7
+import java.util.Iterator;
  8
+import java.util.List;
  9
+
  10
+/**
  11
+ * List of changeset that went into a particular build.
  12
+ *
  13
+ * @author Nigel Magnay
  14
+ */
  15
+public class GitChangeSetList extends ChangeLogSet<GitChangeSet> {
  16
+
  17
+	private final List<GitChangeSet> changeSets;
  18
+
  19
+	/* package */GitChangeSetList(AbstractBuild build, List<GitChangeSet> logs) {
  20
+		super(build);
  21
+		Collections.reverse(logs); // put new things first
  22
+		this.changeSets = Collections.unmodifiableList(logs);
  23
+		for (GitChangeSet log : logs) {
  24
+			log.setParent(this);
  25
+		}
  26
+	}
  27
+
  28
+	public boolean isEmptySet() {
  29
+		return this.changeSets.isEmpty();
  30
+	}
  31
+
  32
+	public Iterator<GitChangeSet> iterator() {
  33
+		return this.changeSets.iterator();
  34
+	}
  35
+
  36
+	public List<GitChangeSet> getLogs() {
  37
+		return this.changeSets;
  38
+	}
  39
+
  40
+}
67  src/main/java/hudson/plugins/git/GitLastHashProperty.java
... ...
@@ -0,0 +1,67 @@
  1
+package hudson.plugins.git;
  2
+
  3
+import hudson.Launcher;
  4
+import hudson.model.AbstractBuild;
  5
+import hudson.model.AbstractProject;
  6
+import hudson.model.BuildListener;
  7
+import hudson.model.Job;
  8
+import hudson.model.JobProperty;
  9
+import hudson.model.JobPropertyDescriptor;
  10
+
  11
+import java.io.IOException;
  12
+
  13
+import org.apache.commons.lang.StringUtils;
  14
+import org.kohsuke.stapler.DataBoundConstructor;
  15
+
  16
+public class GitLastHashProperty extends JobProperty<AbstractProject<?, ?>> {
  17
+
  18
+	private String lastHashBuilt;
  19
+
  20
+	@DataBoundConstructor
  21
+	public GitLastHashProperty(String lastHashBuilt) {
  22
+		this.setLastHashBuilt(lastHashBuilt);
  23
+	}
  24
+
  25
+	public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener)
  26
+			throws InterruptedException, IOException {
  27
+		GitSCM scm = (GitSCM) build.getProject().getScm();
  28
+		GitAPI git = new GitAPI(scm.getDescriptor(), launcher, build.getParent().getWorkspace(), listener);
  29
+		String tipHash = git.revParse(scm.getRemoteBranch());
  30
+
  31
+		listener.getLogger().println("Setting last build to " + tipHash);
  32
+		this.setLastHashBuilt(tipHash);
  33
+		build.getProject().save();
  34
+
  35
+		return true;
  36
+	}
  37
+
  38
+	public JobPropertyDescriptor getDescriptor() {
  39
+		return DescriptorImpl.DESCRIPTOR;
  40
+	}
  41
+
  42
+	public static final class DescriptorImpl extends JobPropertyDescriptor {
  43
+		public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl();
  44
+
  45
+		protected DescriptorImpl() {
  46
+			super(GitLastHashProperty.class);
  47
+			this.load();
  48
+		}
  49
+
  50
+		public boolean isApplicable(Class<? extends Job> job) {
  51
+			return true;
  52
+		}
  53
+
  54
+		public String getDisplayName() {
  55
+			return "Last Hash Built";
  56
+		}
  57
+	}
  58
+
  59
+	public String getLastHashBuilt() {
  60
+		return StringUtils.trimToNull(this.lastHashBuilt);
  61
+	}
  62
+
  63
+	public void setLastHashBuilt(String hash) {
  64
+		this.lastHashBuilt = StringUtils.trimToNull(hash);
  65
+	}
  66
+
  67
+}
217  src/main/java/hudson/plugins/git/GitSCM.java
... ...
@@ -0,0 +1,217 @@
  1
+package hudson.plugins.git;
  2
+
  3
+import hudson.FilePath;
  4
+import hudson.Launcher;
  5
+import hudson.Proc;
  6
+import hudson.model.AbstractBuild;
  7
+import hudson.model.AbstractProject;
  8
+import hudson.model.BuildListener;
  9
+import hudson.model.Hudson;
  10
+import hudson.model.TaskListener;
  11
+import hudson.plugins.git.browser.GitWeb;
  12
+import hudson.scm.ChangeLogParser;
  13
+import hudson.scm.RepositoryBrowsers;
  14
+import hudson.scm.SCM;
  15
+import hudson.scm.SCMDescriptor;
  16
+import hudson.util.ByteBuffer;
  17
+import hudson.util.FormFieldValidator;
  18
+
  19
+import java.io.File;
  20
+import java.io.IOException;
  21
+import java.io.Serializable;
  22
+
  23
+import javax.servlet.ServletException;
  24
+
  25
+import org.kohsuke.stapler.DataBoundConstructor;
  26
+import org.kohsuke.stapler.StaplerRequest;
  27
+import org.kohsuke.stapler.StaplerResponse;
  28
+
  29
+public class GitSCM extends SCM implements Serializable {
  30
+
  31
+	private static final long serialVersionUID = 1L;
  32
+	/** Source repository URL from which we pull. */
  33
+	private final String source;
  34
+	private final String branch;
  35
+	private final boolean doMerge;
  36
+	private final String mergeTarget;
  37
+	private GitWeb browser;
  38
+
  39
+	@DataBoundConstructor
  40
+	public GitSCM(String source, String branch, boolean doMerge, String mergeTarget, GitWeb browser) {
  41
+		this.source = source;
  42
+		this.branch = branch;
  43
+		this.browser = browser;
  44
+		this.doMerge = doMerge;
  45
+		this.mergeTarget = mergeTarget;
  46
+	}
  47
+
  48
+	@Override
  49
+	public boolean pollChanges(AbstractProject project, Launcher launcher, FilePath workspace, TaskListener listener)
  50
+			throws IOException, InterruptedException {
  51
+		listener.getLogger().println("Poll for changes");
  52
+		if (project.isBuilding()) {
  53
+			return false;
  54
+		}
  55
+
  56
+		GitAPI git = new GitAPI(this.getDescriptor(), launcher, workspace, listener);
  57
+		this.ensureClonedAndFetched(git, listener);
  58
+
  59
+		String tipHash = git.revParse(this.getRemoteBranch());
  60
+		String lastHash = this.getOrCreateLastProperty(project).getLastHashBuilt();
  61
+		listener.getLogger().println("tip = " + tipHash + ", last = " + lastHash);
  62
+
  63
+		return (tipHash == null) ? false : !tipHash.equals(lastHash);
  64
+	}
  65
+
  66
+	@Override
  67
+	public boolean checkout(AbstractBuild build, Launcher launcher, FilePath workspace, BuildListener listener,
  68
+			File changelogFile) throws IOException, InterruptedException {
  69
+		listener.getLogger().println("Checkout");
  70
+		workspace.mkdirs();
  71
+
  72
+		GitAPI git = new GitAPI(this.getDescriptor(), launcher, workspace, listener);
  73
+		this.ensureClonedAndFetched(git, listener);
  74
+
  75
+		// Only merge if there's a branch to merge that isn't us..
  76
+		if (this.doMerge && !this.getRemoteBranch().equals(this.getRemoteMergeTarget())) {
  77
+			listener.getLogger().println("Merging onto " + this.getMergeTarget());