Repository: go
Issue: archive/tar: add support for writing tar containing sparse files
Labels: NeedsFix,FeatureRequest

I've created a [Github Repo](https://github.com/grubernaut/Golang-Tar) with all the needed steps for reproducing this on Ubuntu 12.04 using Go1.5.1. I've also verified that using Go1.5.2 still experiences this error.

Run `vagrant create` then `vagrant provision` from repository root.

```
vagrant create
vagrant provision
```

Expected Output:

```
$ vagrant provision
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: stdin: is not a tty
==> default: go version go1.5.2 linux/amd64
==> default: Creating Sparse file
==> default: Proving file is truly sparse
==> default: 0 -rw-r--r-- 1 root root 512M Dec  9 15:26 sparse.img
==> default: Compressing in Go without sparse
==> default: Compressing in Go with sparse
==> default: FileInfo File Size: 536870912
==> default: Proving non-sparse in Go gained size on disk
==> default: 512M -rw-r--r-- 1 root root 512M Dec  9 15:26 non_sparse/sparse.img
==> default: Proving sparse in Go DID keep file size on disk
==> default: 0 -rw-r--r-- 1 root root 0 Dec  9 15:26 sparse/sparse.img
==> default: Compressing via tar w/ Sparse Flag set
==> default: Proving sparse via tar DID keep file size on disk
==> default: 0 -rw-r--r-- 1 root root 512M Dec  9 15:26 tar/sparse.img
```

Actual Output:

```
$ vagrant provision
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: stdin: is not a tty
==> default: go version go1.5.2 linux/amd64
==> default: Creating Sparse file
==> default: Proving file is truly sparse
==> default: 0 -rw-r--r-- 1 root root 512M Dec  9 15:35 sparse.img
==> default: Compressing in Go without sparse
==> default: Compressing in Go with sparse
==> default: Proving non-sparse in Go gained size on disk
==> default: 513M -rw-r--r-- 1 root root 512M Dec  9 15:35 non_sparse/sparse.img
==> default: Proving sparse in Go DID NOT keep file size on disk
==> default: 512M -rw-r--r-- 1 root root 512M Dec  9 15:35 sparse/sparse.img
==> default: Compressing via tar w/ Sparse Flag set
==> default: Proving sparse via tar DID keep file size on disk
==> default: 0 -rw-r--r-- 1 root root 512M Dec  9 15:35 tar/sparse.img
```

The Vagrantfile supplied in the repository runs the following shell steps:
- Installs Go
- Creates a sparse file via `truncate -s 512M sparse.img`
- Proves that the file is sparse via `ls -lash sparse.img`
- Runs `compress.go` via `go run compress.go`
- Untars the archives created by `compress.go` via `tar -xf`
- Verifies that the extracted files did not maintain sparse files, both with and without the sparse type set in the tar file's header. `ls -lash sparse.img`
- Uses GNU/Tar to compress the sparse file with the sparse flag set `tar -Scf sparse.tar sparse.img`
- Extracts the archive created by GNU/Tar `tar -xf sparse.tar`
- Proves that GNU/Tar maintained sparse files `ls -lash sparse.img`

This is somewhat related to #12594.

I could also be creating the archive incorrectly, and have tried a few different methods for creating the tar archive, each one however, did not keep the sparse files intact upon extraction of the archive. This also cannot be replicated in OSX as HGFS+ does not have a concept of sparse files, and instantly destroys any file sparseness, hence the need for running and testing the reproduction case in a vagrant vm. 

Any thoughts or hints into this would be greatly appreciated, thanks!