ghqの設定でgetの時にリポジトリのパス名が違う時にしたこと

経緯

  • ローカル環境のリポジトリをghqで管理しようと思い、インストール後にghq get "repository"をしようとした

現象

  • cloneしてこようとしているrepositoryのユーザー名が違ったためcloneできない現象が起こった。

調べたこと

とりあえずどこからusernameをとってきているのだろうと思って実装を見た。

getコマンドがどのように作られているのかをみていると、以下の部分でcloneするURLを組み立てている。

https://github.com/x-motemen/ghq/blob/master/cmd_get.go#L155-L168

	if len(reposFound) == 0 {
		if url, err := newURL(name, false, false); err == nil {
			repo, err := LocalRepositoryFromURL(url, bare)
			if err != nil {
				return err
			}
			_, err = os.Stat(repo.FullPath)


			// if the directory exists
			if err == nil {
				reposFound = append(reposFound, repo)
			}
		}
	}

new URL()を辿るとfillUsernameToPathが使われていて、getの時に引数のforceMeはfalseになっているので内部的にはdetectUserNameが叩かれている。

func detectUserName() (string, error) {
	user, err := gitconfig.Get("ghq.user")
	if (err != nil && !gitconfig.IsNotFound(err)) || user != "" {
		return user, err
	}


	user, err = gitconfig.GitHubUser("")
	if (err != nil && !gitconfig.IsNotFound(err)) || user != "" {
		return user, err
	}


	switch runtime.GOOS {
	case "windows":
		user = os.Getenv("USERNAME")
	default:
		user = os.Getenv("USER")
	}
	if user == "" {
		// Make the error if it does not match any pattern
		return "", fmt.Errorf("failed to detect username. You can set ghq.user to your gitconfig")
	}
	return user, nil
}

detectUserNameの中では

  1. ghq.userがあればそのusernameを返す(GitHub
  2. github.usernameがあればそのusernameを返す(GitHub
  3. 1,2がなければOSUSERとかから取得してくる

のようにしていた。

結論

  • 自分の環境で調べてみたら1・2が設定されていなかったため誤ったリポジトリのパスが生成されていた。
  • なのでgithub.usernameを設定して解決。

あとがき