Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-34309

git-client-plugin: StringIndexOutOfBoundsException when parsing branches

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Minor Minor
    • git-client-plugin
    • None

      we ran into this:

      > git checkout -f a6ecfa813a4c9a5699df4ec39cfdd596852b8d71 # timeout=10
      > git branch -a -v --no-abbrev # timeout=10
      FATAL: String index out of range: -1
      java.lang.StringIndexOutOfBoundsException: String index out of range: -1
      at java.lang.String.substring(String.java:1931)
      at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.parseBranches(CliGitAPIImpl.java:1825)
      at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getBranches(CliGitAPIImpl.java:1847)
      at hudson.plugins.git.GitAPI.getBranches(GitAPI.java:195)
      at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$9.execute(CliGitAPIImpl.java:1969)
      at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$1.call(RemoteGitImpl.java:152)
      at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$1.call(RemoteGitImpl.java:145)
      at hudson.remoting.UserRequest.perform(UserRequest.java:120)
      at hudson.remoting.UserRequest.perform(UserRequest.java:48)
      at hudson.remoting.Request$2.run(Request.java:332)
      at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:68)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
      at java.lang.Thread.run(Thread.java:745)
      at ......remote call to jenkins-node-1(Native Method)
      at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1416)
      at hudson.remoting.UserResponse.retrieve(UserRequest.java:220)
      at hudson.remoting.Channel.call(Channel.java:781)
      at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:145)
      at sun.reflect.GeneratedMethodAccessor208.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:606)
      at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:131)
      at com.sun.proxy.$Proxy65.execute(Unknown Source)
      at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1135)
      at hudson.scm.SCM.checkout(SCM.java:485)
      at hudson.model.AbstractProject.checkout(AbstractProject.java:1269)
      at hudson.model.AbstractBuild$AbstractBuildExecution.defaultCheckout(AbstractBuild.java:607)
      at jenkins.scm.SCMCheckoutStrategy.checkout(SCMCheckoutStrategy.java:86)
      at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:529)
      at hudson.model.Run.execute(Run.java:1738)
      at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:531)
      at hudson.model.ResourceController.execute(ResourceController.java:98)
      at hudson.model.Executor.run(Executor.java:410)

      -> turned out to be a DOS line ending in a commit message “...^M” - which leads to parsing an empty line here
      ====

      versions:
      jenkins-ci: Jenkins ver. 1.656
      Git client plugin 1.19.6
      Git plugin 2.4.4

          [JENKINS-34309] git-client-plugin: StringIndexOutOfBoundsException when parsing branches

          Frank Geusch created issue -
          Mark Waite made changes -
          Assignee Original: Mark Waite [ markewaite ]

          Calvin Bascom added a comment -

          Just hit this as well, the DOS line ending in a commit message was the root cause for me as well.

          Calvin Bascom added a comment - Just hit this as well, the DOS line ending in a commit message was the root cause for me as well.

          i have the same issue with git plugin 2.4.4 but in Jenkins 2.6.

          [Pipeline] git
           > git rev-parse --is-inside-work-tree # timeout=10
          Fetching changes from the remote Git repository
           > git config remote.origin.url http://anakin.ux.dsone.3ds.com:10080/gitlab/3ds/wap.git # timeout=10
          Fetching upstream changes from http://anakin.ux.dsone.3ds.com:10080/gitlab/3ds/wap.git
           > git --version # timeout=10
           > git -c core.askpass=true fetch --tags --progress http://anakin.ux.dsone.3ds.com:10080/gitlab/3ds/wap.git +refs/heads/*:refs/remotes/origin/*
           > git rev-parse refs/remotes/origin/release/419^{commit} # timeout=10
           > git rev-parse refs/remotes/origin/origin/release/419^{commit} # timeout=10
          Checking out Revision cedc2f2495ca3c22d80e0c82de1727d55697e0bf (refs/remotes/origin/release/419)
           > git config core.sparsecheckout # timeout=10
           > git checkout -f cedc2f2495ca3c22d80e0c82de1727d55697e0bf # timeout=10
           > git branch -a -v --no-abbrev # timeout=10
          [Pipeline] }
          [Pipeline] // node
          [Pipeline] End of Pipeline
          java.lang.StringIndexOutOfBoundsException: String index out of range: -1
          	at java.lang.String.substring(String.java:1931)
          	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.parseBranches(CliGitAPIImpl.java:1825)
          	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getBranches(CliGitAPIImpl.java:1847)
          	at hudson.plugins.git.GitAPI.getBranches(GitAPI.java:195)
          	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$9.execute(CliGitAPIImpl.java:1969)
          	at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1135)
          	at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:109)
          	at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:83)
          	at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:73)
          	at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:49)
          	at hudson.security.ACL.impersonate(ACL.java:213)
          	at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.run(AbstractSynchronousNonBlockingStepExecution.java:47)
          	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
          	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
          	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
          	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
          	at java.lang.Thread.run(Thread.java:745)
          

          aurelien leboulanger added a comment - i have the same issue with git plugin 2.4.4 but in Jenkins 2.6. [Pipeline] git > git rev-parse --is-inside-work-tree # timeout=10 Fetching changes from the remote Git repository > git config remote.origin.url http: //anakin.ux.dsone.3ds.com:10080/gitlab/3ds/wap.git # timeout=10 Fetching upstream changes from http: //anakin.ux.dsone.3ds.com:10080/gitlab/3ds/wap.git > git --version # timeout=10 > git -c core.askpass= true fetch --tags --progress http: //anakin.ux.dsone.3ds.com:10080/gitlab/3ds/wap.git +refs/heads/*:refs/remotes/origin/* > git rev-parse refs/remotes/origin/release/419^{commit} # timeout=10 > git rev-parse refs/remotes/origin/origin/release/419^{commit} # timeout=10 Checking out Revision cedc2f2495ca3c22d80e0c82de1727d55697e0bf (refs/remotes/origin/release/419) > git config core.sparsecheckout # timeout=10 > git checkout -f cedc2f2495ca3c22d80e0c82de1727d55697e0bf # timeout=10 > git branch -a -v --no-abbrev # timeout=10 [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang. String .substring( String .java:1931) at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.parseBranches(CliGitAPIImpl.java:1825) at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getBranches(CliGitAPIImpl.java:1847) at hudson.plugins.git.GitAPI.getBranches(GitAPI.java:195) at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$9.execute(CliGitAPIImpl.java:1969) at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1135) at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:109) at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:83) at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:73) at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:49) at hudson.security.ACL.impersonate(ACL.java:213) at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.run(AbstractSynchronousNonBlockingStepExecution.java:47) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang. Thread .run( Thread .java:745)

          Mark Waite added a comment -

          Could one of your provide detailed instructions to create a repository which includes a DOS line ending in a commit message in such a way that it shows this bug? I'm interested in fixing the bug, but because I can't duplicate the bug, I can't really know if the bug is fixed.

          Mark Waite added a comment - Could one of your provide detailed instructions to create a repository which includes a DOS line ending in a commit message in such a way that it shows this bug? I'm interested in fixing the bug, but because I can't duplicate the bug, I can't really know if the bug is fixed.

          Frank Geusch added a comment -

          in our case, this seems to be caused by git revert COMMIT - the default message generated by git contains a ^M at the end (ergo the empty line ergo the exception, fix seems obvious tho)

          Frank Geusch added a comment - in our case, this seems to be caused by git revert COMMIT - the default message generated by git contains a ^M at the end (ergo the empty line ergo the exception, fix seems obvious tho)

          Mark Waite added a comment -

          I've been surprised many times by what I thought were obvious fixes which exposed interesting and unexpected side effects when I duplicated the problem, wrote an automated test for the problem, then implemented a fix.

          If you're not willing to provide detailed instructions, could you provide a sample repository that I can use as an example of the problem?

          Mark Waite added a comment - I've been surprised many times by what I thought were obvious fixes which exposed interesting and unexpected side effects when I duplicated the problem, wrote an automated test for the problem, then implemented a fix. If you're not willing to provide detailed instructions, could you provide a sample repository that I can use as an example of the problem?

          Calvin Bascom added a comment -

          To get a repo with a commit message having the DOS line ending, you can do the following:

          git init
          touch test.txt
          git add test.txt
          git commit -m "This is the first line^MFollowed by the second line"

          To get that ^M character on MAC OS X, I used the key sequence Ctrl+V Ctrl+M. I think this should also work on linux.

          That said, I don't have a repo in this state anymore since it was a short lived branch that caused this for me and I just deleted that branch. When I created a new branch with the above method, I am unable to reproduce this since the 'git branch -a -v --no-abbrev # timeout=10' command is not being executed under my current setup. Will update further if I am able to figure out what conditions cause that command to be executed.

          Calvin Bascom added a comment - To get a repo with a commit message having the DOS line ending, you can do the following: git init touch test.txt git add test.txt git commit -m "This is the first line^MFollowed by the second line" To get that ^M character on MAC OS X, I used the key sequence Ctrl+V Ctrl+M. I think this should also work on linux. That said, I don't have a repo in this state anymore since it was a short lived branch that caused this for me and I just deleted that branch. When I created a new branch with the above method, I am unable to reproduce this since the 'git branch -a -v --no-abbrev # timeout=10' command is not being executed under my current setup. Will update further if I am able to figure out what conditions cause that command to be executed.

          Mark Waite added a comment -

          I've created the branch JENKINS-34309 on my jenkins-bugs github repository. That branch includes an "ant" script (build.xml) which by default updates a file (build.number) and commits the update with a Ctrl+M embedded in the commit message.

          I have a freestyle job polling that repository and that branch and don't see the failure.

          I see an earlier reference to a pipeline job. Was your case using a pipeline job as well? If not, what job type were you using?

          Mark Waite added a comment - I've created the branch JENKINS-34309 on my jenkins-bugs github repository. That branch includes an "ant" script (build.xml) which by default updates a file (build.number) and commits the update with a Ctrl+M embedded in the commit message. I have a freestyle job polling that repository and that branch and don't see the failure. I see an earlier reference to a pipeline job. Was your case using a pipeline job as well? If not, what job type were you using?

          Calvin Bascom added a comment -

          My case was definitely a pipeline job but so far I am also unable to reproduce this even with a pipeline job.

          Calvin Bascom added a comment - My case was definitely a pipeline job but so far I am also unable to reproduce this even with a pipeline job.

            Unassigned Unassigned
            zerofudge Frank Geusch
            Votes:
            0 Vote for this issue
            Watchers:
            7 Start watching this issue

              Created:
              Updated:
              Resolved: