What to do about go fmt 1.4 ?

John Meinel john at arbash-meinel.com
Wed Mar 11 10:14:02 UTC 2015


Note that 'go fmt' isn't the only one confused by this.

"go test" also gives incorrect paths:
$ cd $HOME/jc/worker/uniter/relation
$ go build
../../../../dev/go/src/
github.com/juju/juju/worker/uniter/relation/livesource.go:130: undefined:
change

However "../" is actually evaluated relative to the real CWD (because it is
a real directory entry). So the "../" of $HOME/jc is not $HOME it is
$HOME/dev/go/src/github.com/juju

Put a different way,
/home/jameinel/jc/../jc != /home/jameinel/jc

(ls /home/jameinel/jc/../jc => no such file or directory)

The assumptions of path.Clean() only hold true if there are no symlinks
along the path.

John
=:->


On Wed, Mar 11, 2015 at 10:52 AM, John Meinel <john at arbash-meinel.com>
wrote:

>
>
> On Tue, Mar 10, 2015 at 6:13 PM, roger peppe <roger.peppe at canonical.com>
> wrote:
>
>> On 10 March 2015 at 12:52, John Meinel <john at arbash-meinel.com> wrote:
>> > So there are 2 changes that I encountered with upgrading go to 1.4.2:
>> >
>> > 1) They changed how they sort import paths. Currently all our imports
>> are:
>> >
>> >  "github.com/juju/juju/bar"
>> >  coretesting "github.com/juju/juju/testing"
>> > (sorted by the import string)
>> >
>> > It wants to sort them as:
>> >
>> >  coretesting "github.com/juju/juju/testing"
>> >  "github.com/juju/juju/bar"
>> >
>> > (sorted by the local name)
>>
>> Are you sure about this? I believe that play.golang.org
>> is running go 1.4 and this code is canonically formatted there,
>> despite unordered local names: http://play.golang.org/p/5R8dyHJG5e
>>
>>
> Yeah, I was wrong here. It had moved a line I hadn't changed, and I was
> confused, but it was user error, not the tool.
>
>
>
>> > 2) It no longer works if you have a symlink in your PWD
>> > Because of the need for exact paths, I have a link from $HOME/jc =>
>> > $HOME/dev/go/src/github.com/juju/juju
>> > However, if I do "go fmt" it now complains that:
>> > stat ../../../dev/go/src/github.com/juju/juju/worker/uniter/deployer.go:
>> no
>> > such file or directory
>> >
>> > (it seems to be using pwd -P and then using relative paths to that)
>> >
>> > Anyone know why it would need to do that?
>> >
>> > I can work around it with "cd jc; cd `pwd -P`" or some other form so I
>> don't
>> > have to type the long form each time.
>>
>> Can you show a step-by-step way to reproduce this please?
>> If you cd into jc, surely you are now in $HOME/dev/go/src/
>> github.com/juju/juju,
>> and I don't see how that's a problem. (but I've not seen the pwd -P flag
>> before and don't understand how that works either - how can the pwd
>> command know what symlinks were used to get to the current working
>> directory?)
>>
>>   cheers,
>>     rog.
>>
>
> So if I do:
>
> $ cd $HOME
> $ mkdir $HOME/dev/foo
> $ ln -s $HOME/dev/foo bar
> $ cd bar
> $ echo $PWD
> /home/jameinel/bar
> $ pwd
> /home/jameinel/bar
> $ pwd -P
> /home/jameinel/dev/foo
>
> So Bash sets $PWD based on what you actually issued to "cd".
> If I write this go code:
>
> package main
>
> import (
>  "os"
>  "fmt"
>  "path/filepath"
> )
>
> func main() {
>   dir, _ := os.Getwd()
>   fmt.Printf("dir: %s\n", dir)
>   pwd := os.Getenv("PWD")
>   fmt.Printf("PWD: %s\n", pwd)
>   expand, _ := filepath.EvalSymlinks(pwd)
>   fmt.Printf("expanded: %s\n", expand)
> }
>
>
> I get:
>
> dir: /home/jameinel/dev/foo
> PWD: /home/jameinel/bar
> expanded: /home/jameinel/dev/foo
>
> So it would seem that "go fmt" is using os.Getenv("PWD") or some variant
> instead of using os.Getwd().
>
> What I *really* don't understand is that if I'm at the top level and I do
> "go fmt" it shows:
>
> ~/jc $ go fmt
> ...
> stat ../dev/go/src/github.com/juju/juju/doc.go: no such file or directory
>
> ~/jc $ cd worker/uniter/filter
> ~/jc/worker/uniter/filter $ go fmt
> ...
> stat ../../../../dev/go/src/
> github.com/juju/juju/worker/uniter/filter/filter.go: no such file or
> directory
>
> I really don't understand all the interactions with PWD or why it is
> trying to stat "../../../../". How does it know about dev/go/src/
> github.com/juju/juju but then try to apply that to PWD?
>
> If you have go 1.4 it should be easy to test this.
>
> John
> =:->
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ubuntu.com/archives/juju-dev/attachments/20150311/f77afba8/attachment.html>


More information about the Juju-dev mailing list