Repository: beeware/briefcase

Issue:
briefcase package -u returns unrecognized arguments: -u
**Describe the bug**
Beeware Tutorial 4 says that the `briefcase package` command accepts the `-u` option but this does not work on Windows when attempting to build the MSI  

**To Reproduce**

1. Complete the Tutorial 4 to the end 
https://docs.beeware.org/en/latest/tutorial/tutorial-4.html#update-and-run-in-one-step

See the error returned:

```
usage: briefcase package windows msi [-h] [-v] [-V] [--no-input]
briefcase package windows msi: error: unrecognized arguments: -u
```

**Environment:**
 - Operating System: Windows 10 Pro, Version 2004 
 - Python version: Python 3.7.7
 - Software versions:
   - Briefcase: 0.3.3
   - Toga: 0.3.0.dev22


Discussion:

Patch:
diff --git a/changes/473.feature.rst b/changes/473.feature.rst
new file mode 100644
index 00000000..1cd1f011
--- /dev/null
+++ b/changes/473.feature.rst
@@ -0,0 +1,1 @@
+Apps can be updated as part of a call to package.
diff --git a/src/briefcase/commands/package.py b/src/briefcase/commands/package.py
index ec77afeb..77784d6b 100644
--- a/src/briefcase/commands/package.py
+++ b/src/briefcase/commands/package.py
@@ -71,6 +71,12 @@ class PackageCommand(BaseCommand):
         return state
 
     def add_options(self, parser):
+        parser.add_argument(
+            '-u',
+            '--update',
+            action="store_true",
+            help='Update the app before building'
+        )
         parser.add_argument(
             '-p',
             '--packaging-format',


Test patch:
diff --git a/tests/commands/package/test_call.py b/tests/commands/package/test_call.py
index 2ea9731a..9047cd3a 100644
--- a/tests/commands/package/test_call.py
+++ b/tests/commands/package/test_call.py
@@ -69,6 +69,7 @@ def test_no_args_package_two_app(package_command, first_app, second_app):
                 "adhoc_sign": False,
                 "identity": None,
                 "sign_app": True,
+                # state of previous calls have been preserved.
                 "package_state": "first",
             },
         ),
@@ -206,6 +207,7 @@ def test_no_sign_args_package_two_app(package_command, first_app, second_app):
                 "adhoc_sign": False,
                 "identity": None,
                 "sign_app": False,
+                # state of previous calls have been preserved.
                 "package_state": "first",
             },
         ),
@@ -252,6 +254,7 @@ def test_adhoc_sign_args_package_two_app(package_command, first_app, second_app)
                 "adhoc_sign": True,
                 "identity": None,
                 "sign_app": True,
+                # state of previous calls have been preserved.
                 "package_state": "first",
             },
         ),
@@ -296,6 +299,7 @@ def test_identity_sign_args_package_two_app(package_command, first_app, second_a
                 "adhoc_sign": False,
                 "identity": "test",
                 "sign_app": True,
+                # state of previous calls have been preserved.
                 "package_state": "first",
             },
         ),
@@ -331,3 +335,152 @@ def test_package_alternate_format(package_command, first_app):
             }
         ),
     ]
+
+
+def test_update_package_one_app(package_command, first_app):
+    "If there is one app, and a -u argument, package updates the app"
+    # Add a single app
+    package_command.apps = {
+        "first": first_app,
+    }
+
+    # Configure no command line options
+    options = package_command.parse_options(["-u"])
+
+    # Run the run command
+    package_command(**options)
+
+    # The right sequence of things will be done
+    assert package_command.actions == [
+        # Tools are verified
+        ("verify", ),
+        # Update (and then build) the first app
+        (
+            "update",
+            "first",
+            {
+                "adhoc_sign": False,
+                "identity": None,
+                "sign_app": True,
+            }
+        ),
+        (
+            "build",
+            "first",
+            {
+                "adhoc_sign": False,
+                "identity": None,
+                "sign_app": True,
+                "update_state": "first",
+            }
+        ),
+        # Package the first app
+        (
+            "package",
+            "first",
+            {
+                "packaging_format": "pkg",
+                "adhoc_sign": False,
+                "identity": None,
+                "sign_app": True,
+                "update_state": "first",
+                "build_state": "first",
+            }
+        ),
+    ]
+
+
+def test_update_package_two_app(package_command, first_app, second_app):
+    "If there are multiple apps, update and publish all of them"
+    # Add two apps
+    package_command.apps = {
+        "first": first_app,
+        "second": second_app,
+    }
+
+    # Configure no command line options
+    options = package_command.parse_options(["--update"])
+
+    # Run the package command
+    package_command(**options)
+
+    # The right sequence of things will be done
+    assert package_command.actions == [
+        # Tools are verified
+        ("verify", ),
+        # Update (and then build) the first app
+        (
+            "update",
+            "first",
+            {
+                "adhoc_sign": False,
+                "identity": None,
+                "sign_app": True,
+            }
+        ),
+        (
+            "build",
+            "first",
+            {
+                "adhoc_sign": False,
+                "identity": None,
+                "sign_app": True,
+                "update_state": "first",
+            }
+        ),
+        # Package the first app
+        (
+            "package",
+            "first",
+            {
+                "packaging_format": "pkg",
+                "adhoc_sign": False,
+                "identity": None,
+                "sign_app": True,
+                "update_state": "first",
+                "build_state": "first",
+            }
+        ),
+        # Update (and then build) the second app
+        (
+            "update",
+            "second",
+            {
+                "adhoc_sign": False,
+                "identity": None,
+                "sign_app": True,
+                # state of previous calls have been preserved.
+                "update_state": "first",
+                "build_state": "first",
+                "package_state": "first",
+            }
+        ),
+        (
+            "build",
+            "second",
+            {
+                "adhoc_sign": False,
+                "identity": None,
+                "sign_app": True,
+                "update_state": "second",
+                # state of previous calls have been preserved.
+                "build_state": "first",
+                "package_state": "first",
+            }
+        ),
+        # package the second app
+        (
+            "package",
+            "second",
+            {
+                'packaging_format': 'pkg',
+                "adhoc_sign": False,
+                "identity": None,
+                "sign_app": True,
+                "update_state": "second",
+                "build_state": "second",
+                # state of previous calls have been preserved.
+                "package_state": "first",
+            },
+        ),
+    ]