sdboyer / gps

your dependencies have arrived
MIT License
270 stars 24 forks source link

Errors in `svn checkout` do not propagate correctly #200

Open spenczar opened 7 years ago

spenczar commented 7 years ago

TestSvnRepo panics for me on the current master:

-> % go test -v -run TestSvnRepo .
=== RUN   TestSvnRepo
--- FAIL: TestSvnRepo (0.05s)
    vcs_repo_test.go:45: Problem checking out repo or SVN CheckLocal is not working
    vcs_repo_test.go:51: Unable to update SVN repo version. Err was unable to update checked out version
    vcs_repo_test.go:57: Error checking checked SVN out version
    vcs_repo_test.go:60: Unable to retrieve checked out version
    vcs_repo_test.go:66: unable to update repository
    vcs_repo_test.go:75: Unable to retrieve checked out version
    vcs_repo_test.go:80: unable to retrieve commit information
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
    panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x13d9ed7]

goroutine 21 [running]:
testing.tRunner.func1(0xc42026a340)
    /Users/snelson/go1.8/src/testing/testing.go:622 +0x29d
panic(0x14b91e0, 0x1a93810)
    /Users/snelson/go1.8/src/runtime/panic.go:489 +0x2cf
github.com/sdboyer/gps.TestSvnRepo(0xc42026a340)
    /Users/snelson/go/src/github.com/sdboyer/gps/vcs_repo_test.go:82 +0x727
testing.tRunner(0xc42026a340, 0x1551ce0)
    /Users/snelson/go1.8/src/testing/testing.go:657 +0x96
created by testing.(*T).Run
    /Users/snelson/go1.8/src/testing/testing.go:697 +0x2ca
exit status 2
FAIL    github.com/sdboyer/gps  2.695s

This panic is happening because even though the err = repo.Get() line at L45 doesn't return an error, it is, in fact, failing. I hacked into the internals to print the command output, and I saw this:

2017/03/20 18:34:20 running command &{%!s(*exec.Cmd=&{/usr/bin/svn [svn checkout https://github.com/Masterminds/VCSTestRepo/trunk /var/folders/07/3tqty4fn0pqdmk8kyscf2g2m0wg_zb/T/go-vcs-svn-tests045048261/VCSTestRepo] []  <nil> 0xc420249800 0xc420249830 [] <nil> <nil> <nil> <nil> <nil> false [] [] [] [] <nil> <nil>}) %!s(time.Duration=120000000000) %!s(*gps.activityBuffer=&{{0 0} 0xc4201a7810 {0 0 <nil>}}) %!s(*gps.activityBuffer=&{{0 0} 0xc4201a7880 {0 0 <nil>}})}
2017/03/20 18:34:20 out=svn: E170013: Unable to connect to a repository at URL 'https://github.com/Masterminds/VCSTestRepo/trunk'
svn: E230001: Server SSL certificate verification failed: issuer is not trusted

Is it that the svn command exits with 0? No, it exits with 1:

-> % svn checkout "https://github.com/Masterminds/VCSTestRepo/trunk" . --non-interactive
svn: E170013: Unable to connect to a repository at URL 'https://github.com/Masterminds/VCSTestRepo/trunk'
svn: E230001: Server SSL certificate verification failed: issuer is not trusted

-> % echo $?
1

So it appears that the failure isn't getting correctly plumbed through.

sdboyer commented 7 years ago

Hmm, odd. (thanks for digging!)

Honestly, I haven't looked closely at the svn stuff (it's recently added, we didn't really support it before). All of the error handling there should follow a pretty standard pattern (that certainly does catch non-0 exit codes), so at first glance, it seems most likely that what we have just doesn't quite follow the pattern correctly.

jstemmer commented 7 years ago

There are a few things happening here.

I'm fairly certain that the reason that err didn't return an error even though the command failed was because of a bug in runFromCwd. I've fixed this in #204.

I don't know why you saw an SSL verification error, it works for me currently. You had to dig a bit to find this, because the errors returned from the vcs package don't print the entire error message by default. It stores the error returned from running the command in the Original variable, however this isn't printed in the tests. @sdboyer this might be a case where including the original error in unwrapVcsErr() could be useful, but I'll have to investigate a bit more to be sure.

And finally, the reason for the nil pointer panic is that these tests don't stop when encountering errors, instead of calling t.Error it should actually be calling t.Fatal. I've created #205 to address this.

sdboyer commented 7 years ago

@jstemmer yeah, I'm convinced. I was also noting the actual errors not making it through the other night while working on #196. If you make a PR to fix unwrapVcsError(), I'll merge it 😄

jstemmer commented 7 years ago

Sorry, it looks like I was mistaken. I've ran a few tests with invalid repo urls and the original error only contains the string exit status 1. The actual error message is already captured from the command output and unwrapVcsErr propagates that correctly. For this particular case it wouldn't add much value to include the original error. I'd be interested to know if it actually contained some useful information for the particular case you mentioned when working on #196.

sdboyer commented 7 years ago

Eh...it was late, and I was debugging a massively concurrent test, so I don't remember exactly :/ It may have been that I didn't have the fix from #204 yet at that point (I later adapted it into #196).

fabulous-gopher commented 7 years ago

This issue was moved to golang/dep#416