diff --git a/recipes/README.recipes.md b/recipes/README.recipes.md
index 6c54ce37b3..c2752705b5 100644
--- a/recipes/README.recipes.md
+++ b/recipes/README.recipes.md
@@ -734,9 +734,9 @@ Args:
* dry_run (bool): If True, don't actually run the step; just log what
the step would have been.
-— **def [cat](/recipes/recipe_modules/gsutil/api.py#129)(self, url, args=None, \*\*kwargs):**
+— **def [cat](/recipes/recipe_modules/gsutil/api.py#135)(self, url, args=None, \*\*kwargs):**
- **@contextlib.contextmanager**
— **def [configure\_gsutil](/recipes/recipe_modules/gsutil/api.py#183)(self, \*\*kwargs):**
+ **@contextlib.contextmanager**
— **def [configure\_gsutil](/recipes/recipe_modules/gsutil/api.py#189)(self, \*\*kwargs):**
Temporarily configures the behavior of gsutil.
@@ -748,21 +748,21 @@ possible configurations.
Args:
kwargs: Every keyword arg is treated as config line in the temp Boto file.
-— **def [copy](/recipes/recipe_modules/gsutil/api.py#143)(self, source_bucket, source, dest_bucket, dest, args=None, link_name='gsutil.copy', metadata=None, unauthenticated_url=False, \*\*kwargs):**
+— **def [copy](/recipes/recipe_modules/gsutil/api.py#149)(self, source_bucket, source, dest_bucket, dest, args=None, link_name='gsutil.copy', metadata=None, unauthenticated_url=False, \*\*kwargs):**
-— **def [download](/recipes/recipe_modules/gsutil/api.py#115)(self, bucket, source, dest, args=None, \*\*kwargs):**
+— **def [download](/recipes/recipe_modules/gsutil/api.py#121)(self, bucket, source, dest, args=None, \*\*kwargs):**
-— **def [download\_url](/recipes/recipe_modules/gsutil/api.py#122)(self, url, dest, args=None, \*\*kwargs):**
+— **def [download\_url](/recipes/recipe_modules/gsutil/api.py#128)(self, url, dest, args=None, \*\*kwargs):**
**@property**
— **def [gsutil\_py\_path](/recipes/recipe_modules/gsutil/api.py#17)(self):**
-— **def [list](/recipes/recipe_modules/gsutil/api.py#162)(self, url, args=None, \*\*kwargs):**
+— **def [list](/recipes/recipe_modules/gsutil/api.py#168)(self, url, args=None, \*\*kwargs):**
-— **def [remove\_url](/recipes/recipe_modules/gsutil/api.py#176)(self, url, args=None, \*\*kwargs):**
+— **def [remove\_url](/recipes/recipe_modules/gsutil/api.py#182)(self, url, args=None, \*\*kwargs):**
-— **def [signurl](/recipes/recipe_modules/gsutil/api.py#169)(self, private_key_file, bucket, dest, args=None, \*\*kwargs):**
+— **def [signurl](/recipes/recipe_modules/gsutil/api.py#175)(self, private_key_file, bucket, dest, args=None, \*\*kwargs):**
-— **def [stat](/recipes/recipe_modules/gsutil/api.py#136)(self, url, args=None, \*\*kwargs):**
+— **def [stat](/recipes/recipe_modules/gsutil/api.py#142)(self, url, args=None, \*\*kwargs):**
— **def [upload](/recipes/recipe_modules/gsutil/api.py#98)(self, source, bucket, dest, args=None, link_name='gsutil.upload', metadata=None, unauthenticated_url=False, \*\*kwargs):**
### *recipe_modules* / [osx\_sdk](/recipes/recipe_modules/osx_sdk)
diff --git a/recipes/recipe_modules/gsutil/api.py b/recipes/recipe_modules/gsutil/api.py
index 0202ba9b64..3c4a4d405d 100644
--- a/recipes/recipe_modules/gsutil/api.py
+++ b/recipes/recipe_modules/gsutil/api.py
@@ -108,8 +108,14 @@ class GSUtilApi(recipe_api.RecipeApi):
if link_name:
is_dir = '-r' in args or '--recursive' in args
- result.presentation.links[link_name] = self._http_url(
- bucket, dest, is_directory=is_dir, is_anonymous=unauthenticated_url)
+ link = self._http_url(bucket,
+ dest,
+ is_directory=is_dir,
+ is_anonymous=unauthenticated_url)
+ result.presentation.links[link_name] = link
+ if 'gsutil_urls' not in result.presentation.properties:
+ result.presentation.properties['gsutil_urls'] = {}
+ result.presentation.properties['gsutil_urls'][result.name] = full_dest
return result
def download(self, bucket, source, dest, args=None, **kwargs):
diff --git a/recipes/recipe_modules/gsutil/examples/full.expected/basic.json b/recipes/recipe_modules/gsutil/examples/full.expected/basic.json
index 46573fdf45..40e99f1634 100644
--- a/recipes/recipe_modules/gsutil/examples/full.expected/basic.json
+++ b/recipes/recipe_modules/gsutil/examples/full.expected/basic.json
@@ -22,7 +22,8 @@
"infra_step": true,
"name": "gsutil upload",
"~followup_annotations": [
- "@@@STEP_LINK@gsutil.upload@https://storage.googleapis.com/example/some/random/path/to/boom@@@"
+ "@@@STEP_LINK@gsutil.upload@https://storage.googleapis.com/example/some/random/path/to/boom@@@",
+ "@@@SET_BUILD_PROPERTY@gsutil_urls@{\"gsutil upload\": \"gs://example/some/random/path/to/boom\"}@@@"
]
},
{
@@ -49,7 +50,8 @@
"infra_step": true,
"name": "gsutil upload (2)",
"~followup_annotations": [
- "@@@STEP_LINK@gsutil.upload@https://storage.googleapis.com/example/some/random/path/to/boom@@@"
+ "@@@STEP_LINK@gsutil.upload@https://storage.googleapis.com/example/some/random/path/to/boom@@@",
+ "@@@SET_BUILD_PROPERTY@gsutil_urls@{\"gsutil upload (2)\": \"gs://example/some/random/path/to/boom\"}@@@"
]
},
{
@@ -68,7 +70,8 @@
"infra_step": true,
"name": "gsutil upload -r",
"~followup_annotations": [
- "@@@STEP_LINK@gsutil.upload@https://console.cloud.google.com/storage/browser/example/some/random/path@@@"
+ "@@@STEP_LINK@gsutil.upload@https://console.cloud.google.com/storage/browser/example/some/random/path@@@",
+ "@@@SET_BUILD_PROPERTY@gsutil_urls@{\"gsutil upload -r\": \"gs://example/some/random/path\"}@@@"
]
},
{
@@ -87,7 +90,8 @@
"infra_step": true,
"name": "gsutil upload --recursive",
"~followup_annotations": [
- "@@@STEP_LINK@gsutil.upload@https://console.cloud.google.com/storage/browser/example/some/other/random/path@@@"
+ "@@@STEP_LINK@gsutil.upload@https://console.cloud.google.com/storage/browser/example/some/other/random/path@@@",
+ "@@@SET_BUILD_PROPERTY@gsutil_urls@{\"gsutil upload --recursive\": \"gs://example/some/other/random/path\"}@@@"
]
},
{