all: add x-goog-api-client header to outgoing requests

Also removes defunct gensupport/header.go.

Fixes #387

Change-Id: I7905e9ebab24ec9db8eb31770fae8628b62e494f
Reviewed-on: https://code-review.googlesource.com/c/google-api-go-client/+/43416
Reviewed-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Chris Broadfoot <cbro@google.com>
diff --git a/RELEASING.md b/RELEASING.md
index 92dc14b..f979187 100644
--- a/RELEASING.md
+++ b/RELEASING.md
@@ -5,6 +5,7 @@
    version `$NV`.
 1. On master, run `git log $CV..` to list all the changes since the last
    release.
+1. `cd internal/version && go generate && cd ../..`
 1. Edit `CHANGES.md` to include a summary of the changes.
 1. Mail the CL containing the `CHANGES.md` changes. When the CL is approved,
    submit it.
diff --git a/gensupport/header.go b/gensupport/header.go
deleted file mode 100644
index cb5e67c..0000000
--- a/gensupport/header.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gensupport
-
-import (
-	"fmt"
-	"runtime"
-	"strings"
-)
-
-// GoogleClientHeader returns the value to use for the x-goog-api-client
-// header, which is used internally by Google.
-func GoogleClientHeader(generatorVersion, clientElement string) string {
-	elts := []string{"gl-go/" + strings.Replace(runtime.Version(), " ", "_", -1)}
-	if clientElement != "" {
-		elts = append(elts, clientElement)
-	}
-	elts = append(elts, fmt.Sprintf("gdcl/%s", generatorVersion))
-	return strings.Join(elts, " ")
-}
diff --git a/gensupport/header_test.go b/gensupport/header_test.go
deleted file mode 100644
index 8fdb863..0000000
--- a/gensupport/header_test.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gensupport
-
-import (
-	"fmt"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-func TestGoogleClientHeader(t *testing.T) {
-	const genVersion = "20170101"
-	gv := strings.Replace(runtime.Version(), " ", "_", -1)
-	got := GoogleClientHeader(genVersion, "gccl/xyz")
-	want := fmt.Sprintf("gl-go/%s gccl/xyz gdcl/%s", gv, genVersion)
-	if got != want {
-		t.Errorf("got %q, want %q", got, want)
-	}
-
-	got = GoogleClientHeader(genVersion, "")
-	want = fmt.Sprintf("gl-go/%s gdcl/%s", gv, genVersion)
-	if got != want {
-		t.Errorf("got %q, want %q", got, want)
-	}
-}
diff --git a/google-api-go-generator/Makefile b/google-api-go-generator/Makefile
index ba74bfc..32fd5bb 100644
--- a/google-api-go-generator/Makefile
+++ b/google-api-go-generator/Makefile
@@ -8,6 +8,9 @@
 # Download all API specifications and rebuild Go bindings.
 # All downloaded files are cached in $TMPDIR for reuse with 'cached' below.
 all: $(GENERATOR)
+	cd ../internal/version
+	go generate
+	cd -
 	$(GENERATOR) -cache=false -install -api=* -gendir=..
 	go test . -v
 
diff --git a/google-api-go-generator/clients_test.go b/google-api-go-generator/clients_test.go
index 798cb33..94e87e0 100644
--- a/google-api-go-generator/clients_test.go
+++ b/google-api-go-generator/clients_test.go
@@ -36,7 +36,6 @@
 
 //go:generate -command api go run gen.go docurls.go replacements.go -install -api
 
-//go:generate api dfareporting:v2.8
 //go:generate api monitoring:v3
 //go:generate api storage:v1
 
diff --git a/google-api-go-generator/gen.go b/google-api-go-generator/gen.go
index cced0e0..8d0221e 100644
--- a/google-api-go-generator/gen.go
+++ b/google-api-go-generator/gen.go
@@ -27,6 +27,7 @@
 	"unicode"
 
 	"google.golang.org/api/google-api-go-generator/internal/disco"
+	"google.golang.org/api/internal/version"
 )
 
 const (
@@ -1911,6 +1912,7 @@
 
 	pn("\nfunc (c *%s) doRequest(alt string) (*http.Response, error) {", callName)
 	pn(`reqHeaders := make(http.Header)`)
+	pn(`reqHeaders.Set("x-goog-api-client", "gl-go/%s gdcl/%s")`, version.Go(), version.Repo)
 	pn("for k, v := range c.header_ {")
 	pn(" reqHeaders[k] = v")
 	pn("}")
diff --git a/google-api-go-generator/gen_test.go b/google-api-go-generator/gen_test.go
index c01338e..44214d8 100644
--- a/google-api-go-generator/gen_test.go
+++ b/google-api-go-generator/gen_test.go
@@ -17,10 +17,13 @@
 import (
 	"bytes"
 	"flag"
+	"fmt"
 	"io/ioutil"
 	"path/filepath"
 	"strings"
 	"testing"
+
+	"google.golang.org/api/internal/version"
 )
 
 var updateGolden = flag.Bool("update_golden", false, "If true, causes TestAPIs to update golden files")
@@ -54,34 +57,39 @@
 		"wrapnewlines",
 	}
 	for _, name := range names {
-		t.Logf("TEST %s", name)
-		api, err := apiFromFile(filepath.Join("testdata", name+".json"))
-		if err != nil {
-			t.Errorf("Error loading API testdata/%s.json: %v", name, err)
-			continue
-		}
-		clean, err := api.GenerateCode()
-		if err != nil {
-			t.Errorf("Error generating code for %s: %v", name, err)
-			continue
-		}
-		goldenFile := filepath.Join("testdata", name+".want")
-		if *updateGolden {
-			if err := ioutil.WriteFile(goldenFile, clean, 0644); err != nil {
+		t.Run(name, func(t *testing.T) {
+			api, err := apiFromFile(filepath.Join("testdata", name+".json"))
+			if err != nil {
+				t.Fatalf("Error loading API testdata/%s.json: %v", name, err)
+			}
+			clean, err := api.GenerateCode()
+			if err != nil {
+				t.Fatalf("Error generating code for %s: %v", name, err)
+			}
+			goldenFile := filepath.Join("testdata", name+".want")
+			if *updateGolden {
+				if err := ioutil.WriteFile(goldenFile, clean, 0644); err != nil {
+					t.Fatal(err)
+				}
+			}
+			want, err := ioutil.ReadFile(goldenFile)
+			if err != nil {
 				t.Fatal(err)
 			}
-		}
-		want, err := ioutil.ReadFile(goldenFile)
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-		if !bytes.Equal(want, clean) {
-			tf, _ := ioutil.TempFile("", "api-"+name+"-got-json.")
-			tf.Write(clean)
-			tf.Close()
-			t.Errorf("Output for API %s differs: diff -u %s %s", name, goldenFile, tf.Name())
-		}
+			wantStr := strings.Replace(string(want), "gl-go/1.12.5", fmt.Sprintf("gl-go/%s", version.Go()), -1)
+			wantStr = strings.Replace(wantStr, "gdcl/00000000", fmt.Sprintf("gdcl/%s", version.Repo), -1)
+			want = []byte(wantStr)
+			if !bytes.Equal(want, clean) {
+				tf, _ := ioutil.TempFile("", "api-"+name+"-got-json.")
+				if _, err := tf.Write(clean); err != nil {
+					t.Fatal(err)
+				}
+				if err := tf.Close(); err != nil {
+					t.Fatal(err)
+				}
+				t.Errorf("Output for API %s differs: diff -u %s %s", name, goldenFile, tf.Name())
+			}
+		})
 	}
 }
 
diff --git a/google-api-go-generator/testdata/any.want b/google-api-go-generator/testdata/any.want
index 6b51984..8a7fa11 100644
--- a/google-api-go-generator/testdata/any.want
+++ b/google-api-go-generator/testdata/any.want
@@ -853,6 +853,7 @@
 
 func (c *ProjectsLogServicesListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -1084,6 +1085,7 @@
 
 func (c *ProjectsLogServicesIndexesListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -1274,6 +1276,7 @@
 
 func (c *ProjectsLogServicesSinksCreateCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -1421,6 +1424,7 @@
 
 func (c *ProjectsLogServicesSinksDeleteCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -1579,6 +1583,7 @@
 
 func (c *ProjectsLogServicesSinksGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -1738,6 +1743,7 @@
 
 func (c *ProjectsLogServicesSinksListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -1882,6 +1888,7 @@
 
 func (c *ProjectsLogServicesSinksUpdateCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2036,6 +2043,7 @@
 
 func (c *ProjectsLogsDeleteCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2223,6 +2231,7 @@
 
 func (c *ProjectsLogsListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2406,6 +2415,7 @@
 
 func (c *ProjectsLogsEntriesWriteCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2553,6 +2563,7 @@
 
 func (c *ProjectsLogsSinksCreateCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2700,6 +2711,7 @@
 
 func (c *ProjectsLogsSinksDeleteCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2858,6 +2870,7 @@
 
 func (c *ProjectsLogsSinksGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3017,6 +3030,7 @@
 
 func (c *ProjectsLogsSinksListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3161,6 +3175,7 @@
 
 func (c *ProjectsLogsSinksUpdateCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
diff --git a/google-api-go-generator/testdata/blogger-3.want b/google-api-go-generator/testdata/blogger-3.want
index a9d0f6b..823cd96 100644
--- a/google-api-go-generator/testdata/blogger-3.want
+++ b/google-api-go-generator/testdata/blogger-3.want
@@ -1641,6 +1641,7 @@
 
 func (c *BlogUserInfosGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -1804,6 +1805,7 @@
 
 func (c *BlogsGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -1951,6 +1953,7 @@
 
 func (c *BlogsGetByUrlCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2109,6 +2112,7 @@
 
 func (c *BlogsListByUserCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2263,6 +2267,7 @@
 
 func (c *CommentsApproveCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2410,6 +2415,7 @@
 
 func (c *CommentsDeleteCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2540,6 +2546,7 @@
 
 func (c *CommentsGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2758,6 +2765,7 @@
 
 func (c *CommentsListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3024,6 +3032,7 @@
 
 func (c *CommentsListByBlogCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3208,6 +3217,7 @@
 
 func (c *CommentsMarkAsSpamCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3355,6 +3365,7 @@
 
 func (c *CommentsRemoveContentCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3520,6 +3531,7 @@
 
 func (c *PageViewsGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3667,6 +3679,7 @@
 
 func (c *PagesDeleteCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3798,6 +3811,7 @@
 
 func (c *PagesGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3953,6 +3967,7 @@
 
 func (c *PagesInsertCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4129,6 +4144,7 @@
 
 func (c *PagesListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4298,6 +4314,7 @@
 
 func (c *PagesPatchCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4445,6 +4462,7 @@
 
 func (c *PagesUpdateCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4610,6 +4628,7 @@
 
 func (c *PostUserInfosGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4851,6 +4870,7 @@
 
 func (c *PostUserInfosListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -5089,6 +5109,7 @@
 
 func (c *PostsDeleteCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -5227,6 +5248,7 @@
 
 func (c *PostsGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -5416,6 +5438,7 @@
 
 func (c *PostsGetByPathCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -5583,6 +5606,7 @@
 
 func (c *PostsInsertCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -5817,6 +5841,7 @@
 
 func (c *PostsListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -6055,6 +6080,7 @@
 
 func (c *PostsPatchCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -6207,6 +6233,7 @@
 
 func (c *PostsPublishCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -6350,6 +6377,7 @@
 
 func (c *PostsRevertCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -6516,6 +6544,7 @@
 
 func (c *PostsSearchCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -6678,6 +6707,7 @@
 
 func (c *PostsUpdateCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -6832,6 +6862,7 @@
 
 func (c *UsersGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
diff --git a/google-api-go-generator/testdata/getwithoutbody.want b/google-api-go-generator/testdata/getwithoutbody.want
index d9158e2..355fbdb 100644
--- a/google-api-go-generator/testdata/getwithoutbody.want
+++ b/google-api-go-generator/testdata/getwithoutbody.want
@@ -273,6 +273,7 @@
 
 func (c *MetricDescriptorsListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
diff --git a/google-api-go-generator/testdata/http-body.want b/google-api-go-generator/testdata/http-body.want
index 571d8c6..0d0a4d2 100644
--- a/google-api-go-generator/testdata/http-body.want
+++ b/google-api-go-generator/testdata/http-body.want
@@ -322,6 +322,7 @@
 
 func (c *ProjectsLocationsDatasetsFhirStoresFhirCreateResourceCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -464,6 +465,7 @@
 
 func (c *ProjectsLocationsDatasetsFhirStoresFhirReadCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
diff --git a/google-api-go-generator/testdata/json-body.want b/google-api-go-generator/testdata/json-body.want
index 20cc7ee..9aa45a7 100644
--- a/google-api-go-generator/testdata/json-body.want
+++ b/google-api-go-generator/testdata/json-body.want
@@ -2903,6 +2903,7 @@
 
 func (c *ProjectsGetConfigCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3044,6 +3045,7 @@
 
 func (c *ProjectsPredictCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3188,6 +3190,7 @@
 
 func (c *ProjectsJobsCancelCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3327,6 +3330,7 @@
 
 func (c *ProjectsJobsCreateCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3475,6 +3479,7 @@
 
 func (c *ProjectsJobsGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3621,6 +3626,7 @@
 
 func (c *ProjectsJobsGetIamPolicyCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3811,6 +3817,7 @@
 
 func (c *ProjectsJobsListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4014,6 +4021,7 @@
 
 func (c *ProjectsJobsPatchCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4161,6 +4169,7 @@
 
 func (c *ProjectsJobsSetIamPolicyCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4310,6 +4319,7 @@
 
 func (c *ProjectsJobsTestIamPermissionsCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4461,6 +4471,7 @@
 
 func (c *ProjectsLocationsGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4628,6 +4639,7 @@
 
 func (c *ProjectsLocationsListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4803,6 +4815,7 @@
 
 func (c *ProjectsModelsCreateCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4947,6 +4960,7 @@
 
 func (c *ProjectsModelsDeleteCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -5091,6 +5105,7 @@
 
 func (c *ProjectsModelsGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -5237,6 +5252,7 @@
 
 func (c *ProjectsModelsGetIamPolicyCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -5418,6 +5434,7 @@
 
 func (c *ProjectsModelsListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -5619,6 +5636,7 @@
 
 func (c *ProjectsModelsPatchCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -5766,6 +5784,7 @@
 
 func (c *ProjectsModelsSetIamPolicyCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -5915,6 +5934,7 @@
 
 func (c *ProjectsModelsTestIamPermissionsCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -6069,6 +6089,7 @@
 
 func (c *ProjectsModelsVersionsCreateCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -6214,6 +6235,7 @@
 
 func (c *ProjectsModelsVersionsDeleteCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -6362,6 +6384,7 @@
 
 func (c *ProjectsModelsVersionsGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -6545,6 +6568,7 @@
 
 func (c *ProjectsModelsVersionsListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -6742,6 +6766,7 @@
 
 func (c *ProjectsModelsVersionsPatchCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -6898,6 +6923,7 @@
 
 func (c *ProjectsModelsVersionsSetDefaultCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -7052,6 +7078,7 @@
 
 func (c *ProjectsOperationsCancelCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -7187,6 +7214,7 @@
 
 func (c *ProjectsOperationsDeleteCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -7331,6 +7359,7 @@
 
 func (c *ProjectsOperationsGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -7511,6 +7540,7 @@
 
 func (c *ProjectsOperationsListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
diff --git a/google-api-go-generator/testdata/mapofarrayofobjects.want b/google-api-go-generator/testdata/mapofarrayofobjects.want
index c28dfdf..ca19a8a 100644
--- a/google-api-go-generator/testdata/mapofarrayofobjects.want
+++ b/google-api-go-generator/testdata/mapofarrayofobjects.want
@@ -220,6 +220,7 @@
 
 func (c *AtlasGetMapCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
diff --git a/google-api-go-generator/testdata/mapofstrings-1.want b/google-api-go-generator/testdata/mapofstrings-1.want
index 3bf7b8c..3bf9407 100644
--- a/google-api-go-generator/testdata/mapofstrings-1.want
+++ b/google-api-go-generator/testdata/mapofstrings-1.want
@@ -217,6 +217,7 @@
 
 func (c *AtlasGetMapCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
diff --git a/google-api-go-generator/testdata/param-rename.want b/google-api-go-generator/testdata/param-rename.want
index bf33219..98e6a53 100644
--- a/google-api-go-generator/testdata/param-rename.want
+++ b/google-api-go-generator/testdata/param-rename.want
@@ -195,6 +195,7 @@
 
 func (c *EventsMoveCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -345,6 +346,7 @@
 
 func (c *ReportsQueryCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
diff --git a/google-api-go-generator/testdata/repeated.want b/google-api-go-generator/testdata/repeated.want
index 799df06..17bd43e 100644
--- a/google-api-go-generator/testdata/repeated.want
+++ b/google-api-go-generator/testdata/repeated.want
@@ -228,6 +228,7 @@
 
 func (c *AccountsReportsGenerateCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
diff --git a/google-api-go-generator/testdata/required-query.want b/google-api-go-generator/testdata/required-query.want
index e3ba6d7..2411c81 100644
--- a/google-api-go-generator/testdata/required-query.want
+++ b/google-api-go-generator/testdata/required-query.want
@@ -212,6 +212,7 @@
 
 func (c *TechsCountCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
diff --git a/google-api-go-generator/testdata/resource-named-service.want b/google-api-go-generator/testdata/resource-named-service.want
index 784b09e..8f1779f 100644
--- a/google-api-go-generator/testdata/resource-named-service.want
+++ b/google-api-go-generator/testdata/resource-named-service.want
@@ -2231,6 +2231,7 @@
 
 func (c *AppsGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2367,6 +2368,7 @@
 
 func (c *AppsRepairCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2515,6 +2517,7 @@
 
 func (c *AppsLocationsGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2686,6 +2689,7 @@
 
 func (c *AppsLocationsListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -2868,6 +2872,7 @@
 
 func (c *AppsOperationsGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3042,6 +3047,7 @@
 
 func (c *AppsOperationsListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3211,6 +3217,7 @@
 
 func (c *AppsServicesDeleteCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3359,6 +3366,7 @@
 
 func (c *AppsServicesGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3522,6 +3530,7 @@
 
 func (c *AppsServicesListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3715,6 +3724,7 @@
 
 func (c *AppsServicesPatchCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -3872,6 +3882,7 @@
 
 func (c *AppsServicesVersionsCreateCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4019,6 +4030,7 @@
 
 func (c *AppsServicesVersionsDeleteCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4190,6 +4202,7 @@
 
 func (c *AppsServicesVersionsGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4383,6 +4396,7 @@
 
 func (c *AppsServicesVersionsListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4593,6 +4607,7 @@
 
 func (c *AppsServicesVersionsPatchCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4763,6 +4778,7 @@
 
 func (c *AppsServicesVersionsInstancesDebugCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -4928,6 +4944,7 @@
 
 func (c *AppsServicesVersionsInstancesDeleteCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -5096,6 +5113,7 @@
 
 func (c *AppsServicesVersionsInstancesGetCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
@@ -5279,6 +5297,7 @@
 
 func (c *AppsServicesVersionsInstancesListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
+	reqHeaders.Set("x-goog-api-client", "gl-go/1.12.5 gdcl/00000000")
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
diff --git a/internal/version/update_version.sh b/internal/version/update_version.sh
new file mode 100755
index 0000000..fecf1f0
--- /dev/null
+++ b/internal/version/update_version.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+today=$(date +%Y%m%d)
+
+sed -i -r -e 's/const Repo = "([0-9]{8})"/const Repo = "'$today'"/' $GOFILE
+
diff --git a/internal/version/version.go b/internal/version/version.go
new file mode 100644
index 0000000..0ac2e07
--- /dev/null
+++ b/internal/version/version.go
@@ -0,0 +1,71 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//go:generate ./update_version.sh
+
+// Package version contains version information for Google Cloud Client
+// Libraries for Go, as reported in request headers.
+package version
+
+import (
+	"runtime"
+	"strings"
+	"unicode"
+)
+
+// Repo is the current version of the client libraries in this
+// repo. It should be a date in YYYYMMDD format.
+const Repo = "20190802"
+
+// Go returns the Go runtime version. The returned string
+// has no whitespace.
+func Go() string {
+	return goVersion
+}
+
+var goVersion = goVer(runtime.Version())
+
+const develPrefix = "devel +"
+
+func goVer(s string) string {
+	if strings.HasPrefix(s, develPrefix) {
+		s = s[len(develPrefix):]
+		if p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 {
+			s = s[:p]
+		}
+		return s
+	}
+
+	if strings.HasPrefix(s, "go1") {
+		s = s[2:]
+		var prerelease string
+		if p := strings.IndexFunc(s, notSemverRune); p >= 0 {
+			s, prerelease = s[:p], s[p:]
+		}
+		if strings.HasSuffix(s, ".") {
+			s += "0"
+		} else if strings.Count(s, ".") < 2 {
+			s += ".0"
+		}
+		if prerelease != "" {
+			s += "-" + prerelease
+		}
+		return s
+	}
+	return ""
+}
+
+func notSemverRune(r rune) bool {
+	return !strings.ContainsRune("0123456789.", r)
+}
diff --git a/internal/version/version_test.go b/internal/version/version_test.go
new file mode 100644
index 0000000..6633ade
--- /dev/null
+++ b/internal/version/version_test.go
@@ -0,0 +1,35 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package version
+
+import "testing"
+
+func TestGoVer(t *testing.T) {
+	for _, tst := range []struct {
+		in, want string
+	}{
+		{"go1.8", "1.8.0"},
+		{"go1.7.3", "1.7.3"},
+		{"go1.8.typealias", "1.8.0-typealias"},
+		{"go1.8beta1", "1.8.0-beta1"},
+		{"go1.8rc2", "1.8.0-rc2"},
+		{"devel +824f981dd4b7 Tue Apr 29 21:41:54 2014 -0400", "824f981dd4b7"},
+		{"foo bar zipzap", ""},
+	} {
+		if got := goVer(tst.in); got != tst.want {
+			t.Errorf("goVer(%q) = %q, want %q", tst.in, got, tst.want)
+		}
+	}
+}