gitlabhq/gitlabhq — pull request #7693 by mattes (2014-09-05 02:36:12+00:00)
Title: `go get` for public and private repositories

Right now it is not possible to use `go get` with private repositories. Only public repositories are supported.

Public repository:
(this works because of the ``go-import`` meta tag)

```
curl http://example.com/mattes/public_repo?go-get=1

[...]
```

Private repository:
(this fails because it is missing the ``go-import`` meta tag, instead it is trying to redirect me to the sign in page)

```
curl http://example.com/mattes/private_repo?go-get=1

You are being redirected.

```

To make private repositories work, it should include the ``go-import`` meta tag even for private repositories and not redirect. My patch does exactly that. Depending on the user-agent (``go get`` sends ``Go 1.1 package http`` as user-agent) nginx will always render a html page with the correct ``go-import`` meta tag.

It's not a problem to *always* render the ``go-import`` meta tag for ``go get`` user-agents, because ``go get`` will fail in the second step anyway, if the repo doesn't exist. We don't really expose any information about the existence of a repository neither.

With this patch sth like ``go get example.com/mattes/public_repo`` or ``go get example.com/mattes/private_repo`` works as expected. The latter one will ask for user credentials in the terminal, if there is no ``~/.netrc`` file given. [Github uses OAuth tokens](https://coderwall.com/p/jtujgw) here, Gitlab wants you to use your username/password combination. (Is it possible to use the private token?).

An example ``~/.netrc`` could look like:

```
machine example.com login mattes password abc12356789
```

With this information in ``~/.netrc`` the command ``go get example.com/mattes/private_repo`` won't ask for user credentials anymore.

---

A different approach might be to add a router constraint in ``config/routes.rb`` depending on the user-agent and then to render a html page here. I like the nginx approach more though.

---

If you do sth like ``go get example.com/mattes/private_repo.git`` (note the suffix ``.git``) ``go get`` will use SSH instead of HTTPS. (I read that ``go get`` only uses HTTP, but I guess that info is outdated.). So if you added your public key to Gitlab, you could just add to ``~/.ssh/config``:

```
# example.com
Host example.com
Hostname example.com
User git
```
... and be able to ``go get example.com/mattes/private_repo.git`` as well. Downside: go import paths will always have the ``.git`` sufix: ``example.com/mattes/private_repo.git`` = ugly.