| ... | 
... | 
@@ -1213,13 +1213,89 @@ def test_external_list(cli, datafiles, tmpdir_factory): | 
| 
1213
 | 
1213
 | 
     result.assert_success()
 
 | 
| 
1214
 | 
1214
 | 
 
 
 | 
| 
1215
 | 
1215
 | 
 
 
 | 
| 
 
 | 
1216
 | 
+@pytest.mark.datafiles(DATA_DIR)
 
 | 
| 
 
 | 
1217
 | 
+def test_multiple_projects_no_force(cli, datafiles, tmpdir_factory):
 
 | 
| 
 
 | 
1218
 | 
+    tmpdir1 = tmpdir_factory.mktemp('')
 | 
| 
 
 | 
1219
 | 
+    tmpdir2 = tmpdir_factory.mktemp('')
 | 
| 
 
 | 
1220
 | 
+    workspace_dir = os.path.join(str(tmpdir1), "workspace")
 
 | 
| 
 
 | 
1221
 | 
+    alpha_project = os.path.join(str(tmpdir1), "alpha-project")
 
 | 
| 
 
 | 
1222
 | 
+    beta_project = os.path.join(str(tmpdir2), "beta-project")
 
 | 
| 
 
 | 
1223
 | 
+
 
 | 
| 
 
 | 
1224
 | 
+    # Open the same workspace with two different projects
 
 | 
| 
 
 | 
1225
 | 
+    # without force, we expect this to fail.
 
 | 
| 
 
 | 
1226
 | 
+    alpha_element, alpha_project, _ = open_workspace(
 
 | 
| 
 
 | 
1227
 | 
+        cli, tmpdir1, datafiles, "git", False, workspace_dir=workspace_dir,
 
 | 
| 
 
 | 
1228
 | 
+        project_path=alpha_project, suffix="-alpha"
 
 | 
| 
 
 | 
1229
 | 
+    )
 
 | 
| 
 
 | 
1230
 | 
+
 
 | 
| 
 
 | 
1231
 | 
+    message = "Opening an already-existing workspace without --force should fail"
 
 | 
| 
 
 | 
1232
 | 
+    with pytest.raises(AssertionError, message=message):
 
 | 
| 
 
 | 
1233
 | 
+        open_workspace(cli, tmpdir2, datafiles, "git", False, workspace_dir=workspace_dir,
 
 | 
| 
 
 | 
1234
 | 
+                       project_path=beta_project, suffix="-beta", force=False)
 
 | 
| 
 
 | 
1235
 | 
+
 
 | 
| 
 
 | 
1236
 | 
+
 
 | 
| 
 
 | 
1237
 | 
+@pytest.mark.datafiles(DATA_DIR)
 
 | 
| 
 
 | 
1238
 | 
+def test_multiple_projects_repeat_open(cli, datafiles, tmpdir_factory):
 
 | 
| 
 
 | 
1239
 | 
+    tmpdir1 = tmpdir_factory.mktemp('')
 | 
| 
 
 | 
1240
 | 
+    tmpdir2 = tmpdir_factory.mktemp('')
 | 
| 
 
 | 
1241
 | 
+    workspace_dir = os.path.join(str(tmpdir1), "workspace")
 
 | 
| 
 
 | 
1242
 | 
+    other_workspace = os.path.join(str(tmpdir1), "workspace2")
 
 | 
| 
 
 | 
1243
 | 
+    alpha_project = os.path.join(str(tmpdir1), "alpha-project")
 
 | 
| 
 
 | 
1244
 | 
+    beta_project = os.path.join(str(tmpdir2), "beta-project")
 
 | 
| 
 
 | 
1245
 | 
+
 
 | 
| 
 
 | 
1246
 | 
+    # Open the same workspace with the same project twice to different workspaces
 
 | 
| 
 
 | 
1247
 | 
+    # Expect this to succeed because we must use --force for multiple project
 
 | 
| 
 
 | 
1248
 | 
+    # behaviour, anyway.
 
 | 
| 
 
 | 
1249
 | 
+    # This test mostly exists so that this behaviour stays consistent.
 
 | 
| 
 
 | 
1250
 | 
+    alpha_element, alpha_project, _ = open_workspace(
 
 | 
| 
 
 | 
1251
 | 
+        cli, tmpdir1, datafiles, "git", False, workspace_dir=workspace_dir,
 
 | 
| 
 
 | 
1252
 | 
+        project_path=alpha_project, suffix="-alpha"
 
 | 
| 
 
 | 
1253
 | 
+    )
 
 | 
| 
 
 | 
1254
 | 
+
 
 | 
| 
 
 | 
1255
 | 
+    args = ['-C', workspace_dir, 'workspace', 'open', '-f', '--directory',
 
 | 
| 
 
 | 
1256
 | 
+            other_workspace, alpha_element]
 
 | 
| 
 
 | 
1257
 | 
+    result = cli.run(project=alpha_project, args=args)
 
 | 
| 
 
 | 
1258
 | 
+    result.assert_success()
 
 | 
| 
 
 | 
1259
 | 
+
 
 | 
| 
 
 | 
1260
 | 
+
 
 | 
| 
 
 | 
1261
 | 
+@pytest.mark.datafiles(DATA_DIR)
 
 | 
| 
 
 | 
1262
 | 
+def test_multiple_projects_repeat_close(cli, datafiles, tmpdir_factory):
 
 | 
| 
 
 | 
1263
 | 
+    tmpdir1 = tmpdir_factory.mktemp('')
 | 
| 
 
 | 
1264
 | 
+    tmpdir2 = tmpdir_factory.mktemp('')
 | 
| 
 
 | 
1265
 | 
+    workspace_dir = os.path.join(str(tmpdir1), "workspace")
 
 | 
| 
 
 | 
1266
 | 
+    alpha_project = os.path.join(str(tmpdir1), "alpha-project")
 
 | 
| 
 
 | 
1267
 | 
+    beta_project = os.path.join(str(tmpdir2), "beta-project")
 
 | 
| 
 
 | 
1268
 | 
+
 
 | 
| 
 
 | 
1269
 | 
+    alpha_element, alpha_project, _ = open_workspace(
 
 | 
| 
 
 | 
1270
 | 
+        cli, tmpdir1, datafiles, "git", False, workspace_dir=workspace_dir,
 
 | 
| 
 
 | 
1271
 | 
+        project_path=alpha_project, suffix="-alpha"
 
 | 
| 
 
 | 
1272
 | 
+    )
 
 | 
| 
 
 | 
1273
 | 
+
 
 | 
| 
 
 | 
1274
 | 
+    beta_element, beta_project, _ = open_workspace(
 
 | 
| 
 
 | 
1275
 | 
+        cli, tmpdir2, datafiles, "git", False, workspace_dir=workspace_dir,
 
 | 
| 
 
 | 
1276
 | 
+        project_path=beta_project, suffix="-beta", force=True
 
 | 
| 
 
 | 
1277
 | 
+    )
 
 | 
| 
 
 | 
1278
 | 
+
 
 | 
| 
 
 | 
1279
 | 
+    # Close the workspace from one project
 
 | 
| 
 
 | 
1280
 | 
+    args = ["-C", workspace_dir, "workspace", "close"]
 
 | 
| 
 
 | 
1281
 | 
+    result = cli.run(project=alpha_project, args=args)
 
 | 
| 
 
 | 
1282
 | 
+    result.assert_success()
 
 | 
| 
 
 | 
1283
 | 
+
 
 | 
| 
 
 | 
1284
 | 
+    # Close the workspace from the other project
 
 | 
| 
 
 | 
1285
 | 
+    result = cli.run(project=beta_project, args=args)
 
 | 
| 
 
 | 
1286
 | 
+    result.assert_success()
 
 | 
| 
 
 | 
1287
 | 
+
 
 | 
| 
 
 | 
1288
 | 
+    # Close the project after it's been closed
 
 | 
| 
 
 | 
1289
 | 
+    result = cli.run(project=beta_project, args=args)
 
 | 
| 
 
 | 
1290
 | 
+    result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.MISSING_PROJECT_CONF)
 
 | 
| 
 
 | 
1291
 | 
+
 
 | 
| 
 
 | 
1292
 | 
+
 
 | 
| 
1216
 | 
1293
 | 
 @pytest.mark.datafiles(DATA_DIR)
 
 | 
| 
1217
 | 
1294
 | 
 @pytest.mark.parametrize(
 
 | 
| 
1218
 | 
 
 | 
-    "force, close_from_external",
 
 | 
| 
1219
 | 
 
 | 
-    [(False, False), (True, True), (True, False)],
 
 | 
| 
1220
 | 
 
 | 
-    ids=["no-force", "close-from-external", "no-close-from-external"]
 
 | 
| 
 
 | 
1295
 | 
+    "close_from_external", [(True), (False)],
 
 | 
| 
 
 | 
1296
 | 
+    ids=["close-from-external", "no-close-from-external"]
 
 | 
| 
1221
 | 
1297
 | 
 )
 
 | 
| 
1222
 | 
 
 | 
-def test_multiple_projects(cli, datafiles, tmpdir_factory, force, close_from_external):
 
 | 
| 
 
 | 
1298
 | 
+def test_multiple_projects(cli, datafiles, tmpdir_factory, close_from_external):
 
 | 
| 
1223
 | 
1299
 | 
     # i.e. multiple projects can open the same workspace
 
 | 
| 
1224
 | 
1300
 | 
     tmpdir1 = tmpdir_factory.mktemp('')
 | 
| 
1225
 | 
1301
 | 
     tmpdir2 = tmpdir_factory.mktemp('')
 | 
| ... | 
... | 
@@ -1232,18 +1308,11 @@ def test_multiple_projects(cli, datafiles, tmpdir_factory, force, close_from_ext | 
| 
1232
 | 
1308
 | 
         cli, tmpdir1, datafiles, "git", False, workspace_dir=workspace_dir,
 
 | 
| 
1233
 | 
1309
 | 
         project_path=alpha_project, suffix="-alpha"
 
 | 
| 
1234
 | 
1310
 | 
     )
 
 | 
| 
1235
 | 
 
 | 
-    if force:
 
 | 
| 
1236
 | 
 
 | 
-        beta_element, beta_project, _ = open_workspace(
 
 | 
| 
1237
 | 
 
 | 
-            cli, tmpdir2, datafiles, "git", False, workspace_dir=workspace_dir,
 
 | 
| 
1238
 | 
 
 | 
-            project_path=beta_project, suffix="-beta", force=force
 
 | 
| 
1239
 | 
 
 | 
-        )
 
 | 
| 
1240
 | 
 
 | 
-    else:
 
 | 
| 
1241
 | 
 
 | 
-        # Opening a workspace on an existing workspace must only work with "--force"
 
 | 
| 
1242
 | 
 
 | 
-        message = "Opening an already-existing workspace without --force should fail"
 
 | 
| 
1243
 | 
 
 | 
-        with pytest.raises(AssertionError, message=message):
 
 | 
| 
1244
 | 
 
 | 
-            open_workspace(cli, tmpdir2, datafiles, "git", False, workspace_dir=workspace_dir,
 
 | 
| 
1245
 | 
 
 | 
-                           project_path=beta_project, suffix="-beta", force=force)
 
 | 
| 
1246
 | 
 
 | 
-        return
 
 | 
| 
 
 | 
1311
 | 
+
 
 | 
| 
 
 | 
1312
 | 
+    beta_element, beta_project, _ = open_workspace(
 
 | 
| 
 
 | 
1313
 | 
+        cli, tmpdir2, datafiles, "git", False, workspace_dir=workspace_dir,
 
 | 
| 
 
 | 
1314
 | 
+        project_path=beta_project, suffix="-beta", force=True
 
 | 
| 
 
 | 
1315
 | 
+    )
 
 | 
| 
1247
 | 
1316
 | 
 
 
 | 
| 
1248
 | 
1317
 | 
     # Run a command and assert it came from the alpha-element
 
 | 
| 
1249
 | 
1318
 | 
     # Using element guessing as a way of easily telling which project was used
 
 |