gclient: throw errors if values from deps_os override deps

With 'flatten' work and in general, we assume deps_os only add to deps,
without attempting to override entries there.

This removes significant edge cases from flatten code,
and ensures DEPS are easier to reason about.

This reverses some past patches and decisions:

a0ad8ad9c9e72291caa387d4ad1d556da3aa860f
https://codereview.chromium.org/11368067
https://bugs.chromium.org/p/chromium/issues/detail?id=157979

ed2b4fe59bb58986a4228606f3fa06dd16883514
https://codereview.chromium.org/23875029
https://bugs.chromium.org/p/chromium/issues/detail?id=248168

These are rather old though (2012-2013), and not expected to be used.

Bug: 570091
Change-Id: I143e95bdaef9d10c937a5f678e6be7e26899ad4d
Reviewed-on: https://chromium-review.googlesource.com/531029
Reviewed-by: Dirk Pranke <dpranke@chromium.org>
Reviewed-by: Andrii Shyshkalov <tandrii@chromium.org>
Commit-Queue: Paweł Hajdan Jr. <phajdan.jr@chromium.org>
diff --git a/gclient.py b/gclient.py
index b25dfaa..0481644 100755
--- a/gclient.py
+++ b/gclient.py
@@ -567,15 +567,19 @@
         target_os_deps[os_dep_key] = None
       else:
         if len(possible_values) > 1:
-          # It would be possible to abort here but it would be
-          # unfortunate if we end up preventing any kind of checkout.
-          logging.error('Conflicting dependencies for %s: %s. (target_os=%s)',
-                        os_dep_key, os_dep_value, target_os_list)
+          raise gclient_utils.Error(
+              'Conflicting dependencies for %s: %s. (target_os=%s)' % (
+                  os_dep_key, os_dep_value, target_os_list))
         # Sorting to get the same result every time in case of conflicts.
         target_os_deps[os_dep_key] = sorted(possible_values)[0]
 
     new_deps = deps.copy()
-    new_deps.update(target_os_deps)
+    for key, value in target_os_deps.iteritems():
+      if key in new_deps:
+        raise gclient_utils.Error(
+            ('Value from deps_os (%r: %r) conflicts with existing deps '
+             'entry (%r).') % (key, value, new_deps[key]))
+      new_deps[key] = value
     return new_deps
 
   def _postprocess_deps(self, deps, rel_prefix):