Merge pull request #540 from mcarmonaa/fix/git-transport-windows-test

*: windows support, skipped receive_pack_test for git transport
diff --git a/config/config.go b/config/config.go
index cb10738..475045e 100644
--- a/config/config.go
+++ b/config/config.go
@@ -5,6 +5,7 @@
 	"bytes"
 	"errors"
 	"fmt"
+	"sort"
 
 	format "gopkg.in/src-d/go-git.v4/plumbing/format/config"
 )
@@ -168,9 +169,16 @@
 		}
 	}
 
-	for name, remote := range c.Remotes {
+	remoteNames := make([]string, 0, len(c.Remotes))
+	for name := range c.Remotes {
+		remoteNames = append(remoteNames, name)
+	}
+
+	sort.Strings(remoteNames)
+
+	for _, name := range remoteNames {
 		if !added[name] {
-			newSubsections = append(newSubsections, remote.marshal())
+			newSubsections = append(newSubsections, c.Remotes[name].marshal())
 		}
 	}
 
diff --git a/config/config_test.go b/config/config_test.go
index 97f4bbf..c27ee26 100644
--- a/config/config_test.go
+++ b/config/config_test.go
@@ -51,13 +51,13 @@
 	output := []byte(`[core]
 	bare = true
 	worktree = bar
-[remote "origin"]
-	url = git@github.com:mcuadros/go-git.git
 [remote "alt"]
 	url = git@github.com:mcuadros/go-git.git
 	url = git@github.com:src-d/go-git.git
 	fetch = +refs/heads/*:refs/remotes/origin/*
 	fetch = +refs/pull/*:refs/remotes/origin/pull/*
+[remote "origin"]
+	url = git@github.com:mcuadros/go-git.git
 [submodule "qux"]
 	url = https://github.com/foo/qux.git
 `)
diff --git a/plumbing/transport/ssh/auth_method.go b/plumbing/transport/ssh/auth_method.go
index f95235b..baae181 100644
--- a/plumbing/transport/ssh/auth_method.go
+++ b/plumbing/transport/ssh/auth_method.go
@@ -3,6 +3,7 @@
 import (
 	"crypto/x509"
 	"encoding/pem"
+	"errors"
 	"fmt"
 	"io/ioutil"
 	"os"
@@ -11,6 +12,7 @@
 
 	"gopkg.in/src-d/go-git.v4/plumbing/transport"
 
+	"github.com/mitchellh/go-homedir"
 	"github.com/xanzy/ssh-agent"
 	"golang.org/x/crypto/ssh"
 	"golang.org/x/crypto/ssh/knownhosts"
@@ -164,6 +166,19 @@
 	}
 }
 
+func username() (string, error) {
+	var username string
+	if user, err := user.Current(); err == nil {
+		username = user.Username
+	} else {
+		username = os.Getenv("USER")
+	}
+	if username == "" {
+		return "", errors.New("failed to get username")
+	}
+	return username, nil
+}
+
 // PublicKeysCallback implements AuthMethod by asking a
 // ssh.agent.Agent to act as a signer.
 type PublicKeysCallback struct {
@@ -176,13 +191,12 @@
 // a pipe with the SSH agent and uses the pipe as the implementer of the public
 // key callback function.
 func NewSSHAgentAuth(u string) (AuthMethod, error) {
+	var err error
 	if u == "" {
-		usr, err := user.Current()
+		u, err = username()
 		if err != nil {
-			return nil, fmt.Errorf("error getting current user: %q", err)
+			return nil, err
 		}
-
-		u = usr.Username
 	}
 
 	a, _, err := sshagent.New()
@@ -241,13 +255,13 @@
 		return files, nil
 	}
 
-	user, err := user.Current()
+	homeDirPath, err := homedir.Dir()
 	if err != nil {
 		return nil, err
 	}
 
 	return []string{
-		filepath.Join(user.HomeDir, "/.ssh/known_hosts"),
+		filepath.Join(homeDirPath, "/.ssh/known_hosts"),
 		"/etc/ssh/ssh_known_hosts",
 	}, nil
 }