Build libgit2 as part of Jiri

This is needed since Jiri now depends on git2go.

Change-Id: Ifd881ba5512d58007e61047054d0ef1d405340c9
diff --git a/recipes/jiri.expected/ci.json b/recipes/jiri.expected/ci.json
index 77f11b7..97c5d1f 100644
--- a/recipes/jiri.expected/ci.json
+++ b/recipes/jiri.expected/ci.json
@@ -41,6 +41,7 @@
     "cmd": [
       "[START_DIR]/cipd/jiri/jiri",
       "import",
+      "-overwrite=true",
       "jiri",
       "https://fuchsia.googlesource.com/manifest"
     ],
@@ -50,7 +51,8 @@
     "cmd": [
       "[START_DIR]/cipd/jiri/jiri",
       "project",
-      "clean"
+      "clean",
+      "-branches=true"
     ],
     "name": "jiri project clean"
   },
@@ -113,33 +115,108 @@
     "stdout": "/path/to/tmp/"
   },
   {
+    "cmd": [],
+    "name": "ensure_packages"
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "--root",
+      "[START_DIR]/cipd",
+      "--list",
+      "fuchsia/tools/cmake/${platform} latest\nfuchsia/tools/ninja/${platform} latest",
+      "--json-output",
+      "/path/to/tmp/json"
+    ],
+    "name": "ensure_packages.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@    {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"package\": \"fuchsia/tools/cmake/${platform}\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    }, @@@",
+      "@@@STEP_LOG_LINE@json.output@    {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"package\": \"fuchsia/tools/ninja/${platform}\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    }@@@",
+      "@@@STEP_LOG_LINE@json.output@  ]@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n  if os.path.exists(path):\n    print \"%s exists but is not a dir\" % path\n    sys.exit(1)\n  os.makedirs(path, mode)\n",
+      "[START_DIR]/go/src/fuchsia.googlesource.com/jiri/vendor/github.com/libgit2/git2go/vendor/libgit2/build",
+      "511"
+    ],
+    "name": "makedirs build",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@python.inline@@@@",
+      "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
+      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
+      "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
+      "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
+      "@@@STEP_LOG_LINE@python.inline@  if os.path.exists(path):@@@",
+      "@@@STEP_LOG_LINE@python.inline@    print \"%s exists but is not a dir\" % path@@@",
+      "@@@STEP_LOG_LINE@python.inline@    sys.exit(1)@@@",
+      "@@@STEP_LOG_LINE@python.inline@  os.makedirs(path, mode)@@@",
+      "@@@STEP_LOG_END@python.inline@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[START_DIR]/cipd/bin/cmake",
+      "-GNinja",
+      "-DCMAKE_BUILD_PROGRAM=[START_DIR]/cipd/ninja",
+      "-DCMAKE_BUILD_TYPE=RelWithDebInfo",
+      "-DCMAKE_C_FLAGS=-fPIC",
+      "-DTHREADSAFE=ON",
+      "-DBUILD_CLAR=OFF",
+      "-DBUILD_SHARED_LIBS=OFF",
+      "[START_DIR]/go/src/fuchsia.googlesource.com/jiri/vendor/github.com/libgit2/git2go/vendor/libgit2"
+    ],
+    "cwd": "[START_DIR]/go/src/fuchsia.googlesource.com/jiri/vendor/github.com/libgit2/git2go/vendor/libgit2/build",
+    "name": "configure libgit2"
+  },
+  {
+    "cmd": [
+      "[START_DIR]/cipd/ninja"
+    ],
+    "cwd": "[START_DIR]/go/src/fuchsia.googlesource.com/jiri/vendor/github.com/libgit2/git2go/vendor/libgit2/build",
+    "name": "build libgit2"
+  },
+  {
     "cmd": [
       "[START_DIR]/cipd/go/bin/go",
-      "build",
+      "build jiri",
       "-ldflags",
       "-X \"fuchsia.googlesource.com/jiri/version.GitCommit=deadbeef\" -X \"fuchsia.googlesource.com/jiri/version.BuildTime=2016-10-11 14:40:25-07:00\"",
       "-a",
       "fuchsia.googlesource.com/jiri/cmd/jiri"
     ],
     "env": {
-      "GOARCH": "amd64",
-      "GOOS": "linux",
       "GOPATH": "[START_DIR]/go",
       "GOROOT": "[START_DIR]/cipd/go"
     },
-    "name": "go build"
+    "name": "go build jiri"
   },
   {
     "cmd": [
       "[START_DIR]/cipd/go/bin/go",
-      "test",
+      "test jiri",
       "fuchsia.googlesource.com/jiri/cmd/jiri"
     ],
     "env": {
       "GOPATH": "[START_DIR]/go",
       "GOROOT": "[START_DIR]/cipd/go"
     },
-    "name": "go test"
+    "name": "go test jiri"
   },
   {
     "name": "$result",
diff --git a/recipes/jiri.expected/cq_try.json b/recipes/jiri.expected/cq_try.json
index ef1a07f..c0777c8 100644
--- a/recipes/jiri.expected/cq_try.json
+++ b/recipes/jiri.expected/cq_try.json
@@ -41,6 +41,7 @@
     "cmd": [
       "[START_DIR]/cipd/jiri/jiri",
       "import",
+      "-overwrite=true",
       "jiri",
       "https://fuchsia.googlesource.com/manifest"
     ],
@@ -50,7 +51,8 @@
     "cmd": [
       "[START_DIR]/cipd/jiri/jiri",
       "project",
-      "clean"
+      "clean",
+      "-branches=true"
     ],
     "name": "jiri project clean"
   },
@@ -123,33 +125,108 @@
     "stdout": "/path/to/tmp/"
   },
   {
+    "cmd": [],
+    "name": "ensure_packages"
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "--root",
+      "[START_DIR]/cipd",
+      "--list",
+      "fuchsia/tools/cmake/${platform} latest\nfuchsia/tools/ninja/${platform} latest",
+      "--json-output",
+      "/path/to/tmp/json"
+    ],
+    "name": "ensure_packages.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@    {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"package\": \"fuchsia/tools/cmake/${platform}\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    }, @@@",
+      "@@@STEP_LOG_LINE@json.output@    {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"package\": \"fuchsia/tools/ninja/${platform}\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    }@@@",
+      "@@@STEP_LOG_LINE@json.output@  ]@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n  if os.path.exists(path):\n    print \"%s exists but is not a dir\" % path\n    sys.exit(1)\n  os.makedirs(path, mode)\n",
+      "[START_DIR]/go/src/fuchsia.googlesource.com/jiri/vendor/github.com/libgit2/git2go/vendor/libgit2/build",
+      "511"
+    ],
+    "name": "makedirs build",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@python.inline@@@@",
+      "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
+      "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
+      "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
+      "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
+      "@@@STEP_LOG_LINE@python.inline@  if os.path.exists(path):@@@",
+      "@@@STEP_LOG_LINE@python.inline@    print \"%s exists but is not a dir\" % path@@@",
+      "@@@STEP_LOG_LINE@python.inline@    sys.exit(1)@@@",
+      "@@@STEP_LOG_LINE@python.inline@  os.makedirs(path, mode)@@@",
+      "@@@STEP_LOG_END@python.inline@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[START_DIR]/cipd/bin/cmake",
+      "-GNinja",
+      "-DCMAKE_BUILD_PROGRAM=[START_DIR]/cipd/ninja",
+      "-DCMAKE_BUILD_TYPE=RelWithDebInfo",
+      "-DCMAKE_C_FLAGS=-fPIC",
+      "-DTHREADSAFE=ON",
+      "-DBUILD_CLAR=OFF",
+      "-DBUILD_SHARED_LIBS=OFF",
+      "[START_DIR]/go/src/fuchsia.googlesource.com/jiri/vendor/github.com/libgit2/git2go/vendor/libgit2"
+    ],
+    "cwd": "[START_DIR]/go/src/fuchsia.googlesource.com/jiri/vendor/github.com/libgit2/git2go/vendor/libgit2/build",
+    "name": "configure libgit2"
+  },
+  {
+    "cmd": [
+      "[START_DIR]/cipd/ninja"
+    ],
+    "cwd": "[START_DIR]/go/src/fuchsia.googlesource.com/jiri/vendor/github.com/libgit2/git2go/vendor/libgit2/build",
+    "name": "build libgit2"
+  },
+  {
     "cmd": [
       "[START_DIR]/cipd/go/bin/go",
-      "build",
+      "build jiri",
       "-ldflags",
       "-X \"fuchsia.googlesource.com/jiri/version.GitCommit=deadbeef\" -X \"fuchsia.googlesource.com/jiri/version.BuildTime=2016-10-11 14:40:25-07:00\"",
       "-a",
       "fuchsia.googlesource.com/jiri/cmd/jiri"
     ],
     "env": {
-      "GOARCH": "amd64",
-      "GOOS": "linux",
       "GOPATH": "[START_DIR]/go",
       "GOROOT": "[START_DIR]/cipd/go"
     },
-    "name": "go build"
+    "name": "go build jiri"
   },
   {
     "cmd": [
       "[START_DIR]/cipd/go/bin/go",
-      "test",
+      "test jiri",
       "fuchsia.googlesource.com/jiri/cmd/jiri"
     ],
     "env": {
       "GOPATH": "[START_DIR]/go",
       "GOROOT": "[START_DIR]/cipd/go"
     },
-    "name": "go test"
+    "name": "go test jiri"
   },
   {
     "name": "$result",
diff --git a/recipes/jiri.py b/recipes/jiri.py
index c840de9..851f88a 100644
--- a/recipes/jiri.py
+++ b/recipes/jiri.py
@@ -9,12 +9,14 @@
 
 
 DEPS = [
+  'infra/cipd',
   'infra/jiri',
   'infra/git',
   'infra/go',
   'recipe_engine/path',
   'recipe_engine/properties',
   'recipe_engine/raw_io',
+  'recipe_engine/shutil',
   'recipe_engine/step',
 ]
 
@@ -37,8 +39,8 @@
   api.jiri.ensure_jiri()
 
   api.jiri.init()
-  api.jiri.import_manifest(manifest, remote)
-  api.jiri.clean_project()
+  api.jiri.import_manifest(manifest, remote, overwrite=True)
+  api.jiri.clean_project(branches=True)
   api.jiri.update(gc=True)
 
   if patch_ref is not None:
@@ -46,9 +48,12 @@
 
   api.go.ensure_go()
 
-  gitdir = api.path['start_dir'].join(
+  jiri_dir = api.path['start_dir'].join(
       'go', 'src', 'fuchsia.googlesource.com', 'jiri')
-  with api.step.context({'cwd': gitdir}):
+  git2go_dir = jiri_dir.join('vendor', 'github.com', 'libgit2', 'git2go')
+  libgit2_dir = git2go_dir.join('vendor', 'libgit2')
+
+  with api.step.context({'cwd': jiri_dir}):
     git_commit = api.git.get_hash()
   result = api.step('date', ['date', '--rfc-3339=seconds'],
       stdout=api.raw_io.output(),
@@ -58,14 +63,37 @@
 
   ldflags = "-X \"fuchsia.googlesource.com/jiri/version.GitCommit=%s\" -X \"fuchsia.googlesource.com/jiri/version.BuildTime=%s\"" % (git_commit, build_time)
   gopath = api.path['start_dir'].join('go')
-  goos, goarch = target.split("-", 2)
 
-  with api.step.context({'env': {'GOPATH': gopath, 'GOOS': goos, 'GOARCH': goarch}}):
-    api.go('build', '-ldflags', ldflags, '-a',
+  with api.step.nest('ensure_packages'):
+    with api.step.context({'infra_step': True}):
+      cipd_dir = api.path['start_dir'].join('cipd')
+      api.cipd.ensure(cipd_dir, {
+        'fuchsia/tools/cmake/${platform}': 'latest',
+        'fuchsia/tools/ninja/${platform}': 'latest',
+      })
+
+  build_dir = libgit2_dir.join('build')
+  api.shutil.makedirs('build', build_dir)
+  with api.step.context({'cwd': build_dir}):
+    api.step('configure libgit2', [
+      cipd_dir.join('bin', 'cmake'),
+      '-GNinja',
+      '-DCMAKE_BUILD_PROGRAM=%s' % cipd_dir.join('ninja'),
+      '-DCMAKE_BUILD_TYPE=RelWithDebInfo',
+      '-DCMAKE_C_FLAGS=-fPIC',
+      '-DTHREADSAFE=ON',
+      '-DBUILD_CLAR=OFF',
+      '-DBUILD_SHARED_LIBS=OFF',
+      libgit2_dir,
+    ])
+    api.step('build libgit2', [cipd_dir.join('ninja')])
+
+  with api.step.context({'env': {'GOPATH': gopath}}):
+    api.go('build jiri', '-ldflags', ldflags, '-a',
            'fuchsia.googlesource.com/jiri/cmd/jiri')
 
   with api.step.context({'env': {'GOPATH': gopath}}):
-    api.go('test', 'fuchsia.googlesource.com/jiri/cmd/jiri')
+    api.go('test jiri', 'fuchsia.googlesource.com/jiri/cmd/jiri')
 
 
 def GenTests(api):