[flutter_deps] Assert no duplicate dependencies

Bug: https://github.com/flutter/flutter/issues/88330
Change-Id: I1a6fd9b468ce38f84edb3526f5ca971370c48ca5
Reviewed-on: https://flutter-review.googlesource.com/c/recipes/+/17184
Reviewed-by: Godofredo Contreras <godofredoc@google.com>
Commit-Queue: Casey Hillers <chillers@google.com>
diff --git a/recipe_modules/flutter_deps/api.py b/recipe_modules/flutter_deps/api.py
index 862d037..b14c3a0 100644
--- a/recipe_modules/flutter_deps/api.py
+++ b/recipe_modules/flutter_deps/api.py
@@ -71,16 +71,26 @@
         'vpython': self.vpython,
         'vs_build': self.vs_build,
     }
+    parsed_deps = []
     for dep in deps:
-      if dep.get('dependency') in ['xcode', 'gems', 'swift']:
+      dependency = dep.get('dependency')
+      version = dep.get('version')
+      # Ensure there are no duplicate entries
+      if dependency in parsed_deps:
+        msg = '''Dependency %s is duplicated
+            Ensure ci.yaml contains only one entry for this target
+            '''.format(dependency)
+        raise ValueError(msg)
+      parsed_deps.append(dependency)
+      if dependency in ['xcode', 'gems', 'swift']:
         continue
-      dep_funct = available_deps.get(dep.get('dependency'))
+      dep_funct = available_deps.get(dependency)
       if not dep_funct:
         msg = '''Dependency %s not available.
             Ensure ci.yaml contains one of the following supported keys:
-            %s'''.format(dep.get('dependency'), available_deps.keys())
+            %s'''.format(dependency, available_deps.keys())
         raise ValueError(msg)
-      dep_funct(env, env_prefixes, dep.get('version'))
+      dep_funct(env, env_prefixes, version)
 
   def open_jdk(self, env, env_prefixes, version):
     """Downloads OpenJdk CIPD package and updates environment variables.
diff --git a/recipe_modules/flutter_deps/examples/full.py b/recipe_modules/flutter_deps/examples/full.py
index adc03d0..80cfea5 100644
--- a/recipe_modules/flutter_deps/examples/full.py
+++ b/recipe_modules/flutter_deps/examples/full.py
@@ -42,6 +42,10 @@
     api.flutter_deps.required_deps(
         env, env_prefixes, [{'dependency': 'does_not_exist'}]
     )
+  with api.assertions.assertRaises(ValueError):
+    api.flutter_deps.required_deps(
+        env, env_prefixes, [{'dependency': 'xcode'}, {'dependency': 'xcode'}]
+    )
   api.flutter_deps.android_sdk(env, env_prefixes, '')
   api.flutter_deps.flutter_engine(env, env_prefixes)
   api.flutter_deps.firebase(env, env_prefixes)