Version 2.2.1-dev.1.1

* Cherry-pick 567d552de8ff93d704111467e7f3bf3b896ab684 to dev
* Cherry-pick 4ca57befd707a0309e384472a566c084eef0e56e to dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e111253..37704bb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 2.2.1-dev.1.1
+
+* Cherry-pick 567d552de8ff93d704111467e7f3bf3b896ab684 to dev
+* Cherry-pick 4ca57befd707a0309e384472a566c084eef0e56e to dev
+
 ## 2.2.1-dev.1.0
 
 ### Tool Changes
diff --git a/DEPS b/DEPS
index 88c3561..f1860721 100644
--- a/DEPS
+++ b/DEPS
@@ -79,7 +79,7 @@
   #     minutes later.
   #
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
-  "dart_style_tag": "1.2.2",  # Please see the note above before updating.
+  "dart_style_tag": "1.2.4",  # Please see the note above before updating.
 
   "dartdoc_tag" : "v0.28.2",
   "fixnum_tag": "0.10.9",
diff --git a/tools/VERSION b/tools/VERSION
index 5df95eb..6ba184f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -34,6 +34,6 @@
 MINOR 2
 PATCH 1
 PRERELEASE 1
-PRERELEASE_PATCH 0
+PRERELEASE_PATCH 1
 ABI_VERSION 0
 OLDEST_SUPPORTED_ABI_VERSION 0
diff --git a/tools/bots/linux_distribution_support.py b/tools/bots/linux_distribution_support.py
index 7e86e8c..28c26c7 100644
--- a/tools/bots/linux_distribution_support.py
+++ b/tools/bots/linux_distribution_support.py
@@ -35,33 +35,14 @@
     return None
   return bot.BuildInfo('none', 'none', 'release', 'linux')
 
-def ArchiveArtifacts(tarfile, builddir, channel):
-  namer = bot_utils.GCSNamer(channel=channel)
-  gsutil = bot_utils.GSUtil()
-  revision = utils.GetArchiveVersion()
-  # Archive the src tar to the src dir
-  remote_tarfile = '/'.join([namer.src_directory(revision),
-                             os.path.basename(tarfile)])
-  gsutil.upload(tarfile, remote_tarfile, public=True)
-  # Archive all files except the tar file to the linux packages dir
-  for entry in os.listdir(builddir):
-    full_path = os.path.join(builddir, entry)
-    # We expect a flat structure, not subdirectories
-    assert(os.path.isfile(full_path))
-    if full_path != tarfile:
-      package_dir = namer.linux_packages_directory(revision)
-      remote_file = '/'.join([package_dir,
-                              os.path.basename(entry)])
-      gsutil.upload(full_path, remote_file, public=True)
-
 def InstallFromDep(builddir):
   for entry in os.listdir(builddir):
     if entry.endswith("_amd64.deb"):
       path = os.path.join(builddir, entry)
-      Run(['sudo', 'dpkg', '-i', path])
+      Run(['dpkg', '-i', path])
 
 def UninstallDart():
-  Run(['sudo', 'dpkg', '-r', 'dart'])
+  Run(['dpkg', '-r', 'dart'])
 
 def CreateDartTestFile(tempdir):
   filename = os.path.join(tempdir, 'test.dart')
@@ -162,13 +143,6 @@
     UninstallDart()
     TestInstallation(assume_installed=False)
 
-  with bot.BuildStep('Upload artifacts'):
-    bot_name, _ = bot.GetBotName()
-    channel = bot_utils.GetChannelFromName(bot_name)
-    if channel != bot_utils.Channel.BLEEDING_EDGE:
-     ArchiveArtifacts(tarfile, builddir, channel)
-    else:
-      print 'Not uploading artifacts on bleeding edge'
 
 if __name__ == '__main__':
   # We pass in None for build_step to avoid building the sdk.
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 4efcdb6..0dc5fc2 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -1246,16 +1246,12 @@
         {
           "name": "build dart",
           "script": "tools/bots/dart_sdk.py",
-          "arguments": [],
-          "environment": {"BUILDBOT_BUILDERNAME": "dart-sdk-linux"}
-
+          "arguments": []
         },
         {
           "name": "build api docs",
           "script": "tools/bots/dart_sdk.py",
-          "arguments": [ "api_docs" ],
-          "environment": {"BUILDBOT_BUILDERNAME": "dart-sdk-linux"}
-
+          "arguments": [ "api_docs" ]
         },
         {
           "name": "upload abi dills",
@@ -1263,8 +1259,7 @@
           "arguments": [
             "tools/VERSION",
             "out/ReleaseX64"
-          ],
-          "environment": {"BUILDBOT_BUILDERNAME": "dart-sdk-linux"}
+          ]
         }
       ]
     },
@@ -1277,9 +1272,7 @@
         {
           "name": "build dart",
           "script": "tools/bots/dart_sdk.py",
-          "arguments": [],
-          "environment": {"BUILDBOT_BUILDERNAME": "dart-sdk-mac"}
-
+          "arguments": []
         }
       ]
     },
@@ -1292,9 +1285,38 @@
         {
           "name": "build dart",
           "script": "tools/bots/dart_sdk.py",
-          "arguments": [],
-          "environment": {"BUILDBOT_BUILDERNAME": "dart-sdk-win"}
-
+          "arguments": []
+        }
+      ]
+    },
+    {
+      "builders": ["debianpackage-linux"],
+      "meta": {
+        "description": "This configuration is used by the debianpackage-builder."
+      },
+      "steps": [
+        {
+          "name": "build debian package",
+          "script": "tools/run_debian_build.sh",
+          "arguments": []
+        },
+        {
+          "name": "upload debian packages",
+          "script": "tools/bots/upload_debian_packages.py",
+          "arguments": []
+        }
+      ]
+    },
+    {
+      "builders": ["versionchecker-linux"],
+      "meta": {
+        "description": "This configuration is used by the versionchecker-builder."
+      },
+      "steps": [
+        {
+          "name": "check version",
+          "script": "tools/bots/version_checker.py",
+          "arguments": []
         }
       ]
     },
diff --git a/tools/bots/upload_debian_packages.py b/tools/bots/upload_debian_packages.py
new file mode 100755
index 0000000..04750c0
--- /dev/null
+++ b/tools/bots/upload_debian_packages.py
@@ -0,0 +1,53 @@
+#!/usr/bin/python
+
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+
+import os
+
+
+import bot
+import bot_utils
+
+
+utils = bot_utils.GetUtils()
+
+
+HOST_OS = utils.GuessOS()
+
+
+def ArchiveArtifacts(tarfile, builddir, channel):
+  namer = bot_utils.GCSNamer(channel=channel)
+  gsutil = bot_utils.GSUtil()
+  revision = utils.GetArchiveVersion()
+  # Archive the src tar to the src dir
+  remote_tarfile = '/'.join([namer.src_directory(revision),
+                             os.path.basename(tarfile)])
+  gsutil.upload(tarfile, remote_tarfile, public=True)
+  # Archive all files except the tar file to the linux packages dir
+  for entry in os.listdir(builddir):
+    full_path = os.path.join(builddir, entry)
+    # We expect a flat structure, not subdirectories
+    assert(os.path.isfile(full_path))
+    if full_path != tarfile:
+      package_dir = namer.linux_packages_directory(revision)
+      remote_file = '/'.join([package_dir,
+                              os.path.basename(entry)])
+      gsutil.upload(full_path, remote_file, public=True)
+
+
+if __name__ == '__main__':
+  bot_name, _ = bot.GetBotName()
+  channel = bot_utils.GetChannelFromName(bot_name)
+  if channel != bot_utils.Channel.BLEEDING_EDGE:
+    builddir = os.path.join(bot_utils.DART_DIR,
+                            utils.GetBuildDir(HOST_OS),
+                            'src_and_installation')
+    version = utils.GetVersion()
+    tarfilename = 'dart-%s.tar.gz' % version
+    tarfile = os.path.join(builddir, tarfilename)
+    ArchiveArtifacts(tarfile, builddir, channel)
+  else:
+    print 'Not uploading artifacts on bleeding edge'
diff --git a/tools/run_debian_build.sh b/tools/run_debian_build.sh
new file mode 100755
index 0000000..66e7d5d
--- /dev/null
+++ b/tools/run_debian_build.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+set -x
+
+ninja=$(which ninja)
+depot_tools=$(dirname $ninja)
+cmd="apt-get update && apt-get -y install build-essential debhelper git python\
+    && PATH=\"$depot_tools:\$PATH\"\
+    python tools/bots/linux_distribution_support.py"
+image="launcher.gcr.io/google/debian8:latest"
+docker run -e BUILDBOT_BUILDERNAME -v $depot_tools:$depot_tools\
+    -v `pwd`:`pwd` -w `pwd` -i --rm $image bash -c "$cmd"
diff --git a/tools/utils.py b/tools/utils.py
index a897eb1..a6db548 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -458,12 +458,12 @@
       return fd.read()
   except:
     pass
-
-  p = subprocess.Popen(['git', 'log', '-n', '1', '--pretty=format:%H'],
+  p = subprocess.Popen(['git', 'rev-parse', 'HEAD'],
                        stdout = subprocess.PIPE,
                        stderr = subprocess.STDOUT, shell=IsWindows(),
                        cwd = DART_DIR)
   output, _ = p.communicate()
+  output = output.strip()
   # We expect a full git hash
   if len(output) != 40:
     print "Warning: could not parse git commit, output was %s" % output
@@ -472,11 +472,12 @@
 
 
 def GetShortGitHash():
-  p = subprocess.Popen(['git', 'log', '-n', '1', '--pretty=format:%h'],
+  p = subprocess.Popen(['git', '--short', 'rev-parse', 'HEAD'],
                        stdout = subprocess.PIPE,
                        stderr = subprocess.STDOUT, shell=IsWindows(),
                        cwd = DART_DIR)
   output, _ = p.communicate()
+  output = output.strip()
   if p.wait() != 0:
     return None
   return output