@@ -989,6 +989,8 @@ extension Workspace {
989
989
diagnostics. emit ( error: " dependency ' \( dependency. package . name) ' already in edit mode " )
990
990
case . local:
991
991
diagnostics. emit ( error: " local dependency ' \( dependency. package . name) ' can't be edited " )
992
+ case . downloaded:
993
+ diagnostics. emit ( error: " dependency downloaded from registry ' \( dependency. package . name) ' can't be edited " )
992
994
}
993
995
return nil
994
996
}
@@ -1200,20 +1202,8 @@ fileprivate extension PinsStore {
1200
1202
///
1201
1203
/// This method does nothing if the dependency is in edited state.
1202
1204
func pin( _ dependency: ManagedDependency ) {
1203
-
1204
- // Get the checkout state.
1205
- let checkoutState : CheckoutState
1206
- switch dependency. state {
1207
- case . checkout( let state) :
1208
- checkoutState = state
1209
- case . edited, . local:
1210
- return
1211
- }
1212
-
1213
- self . pin (
1214
- packageRef: dependency. package ,
1215
- state: checkoutState
1216
- )
1205
+ guard case . checkout( let state) = dependency. state else { return }
1206
+ self . pin ( packageRef: dependency. package , state: state)
1217
1207
}
1218
1208
}
1219
1209
@@ -1325,10 +1315,10 @@ extension Workspace {
1325
1315
if checkout. isBranchOrRevisionBased {
1326
1316
result. insert ( dependency. package )
1327
1317
}
1328
- case . edited:
1329
- continue
1330
1318
case . local:
1331
1319
result. insert ( dependency. package )
1320
+ default :
1321
+ continue
1332
1322
}
1333
1323
}
1334
1324
@@ -1403,7 +1393,7 @@ extension Workspace {
1403
1393
requirement: . unversioned,
1404
1394
products: productFilter)
1405
1395
allConstraints. append ( constraint)
1406
- case . checkout , . local :
1396
+ default :
1407
1397
break
1408
1398
}
1409
1399
allConstraints += try externalManifest. dependencyConstraints ( productFilter: productFilter)
@@ -1417,20 +1407,11 @@ extension Workspace {
1417
1407
var constraints = [ PackageContainerConstraint] ( )
1418
1408
1419
1409
for (_, managedDependency, productFilter) in dependencies {
1420
- switch managedDependency. state {
1421
- case . checkout, . local: continue
1422
- case . edited: break
1423
- }
1424
- // FIXME: We shouldn't need to construct a new package reference object here.
1425
- // We should get the correct one from managed dependency object.
1426
- let ref = PackageReference . local (
1427
- identity: managedDependency. package . identity,
1428
- path: workspace. path ( to: managedDependency)
1429
- )
1430
- let constraint = PackageContainerConstraint (
1431
- package : ref,
1432
- requirement: . unversioned,
1433
- products: productFilter)
1410
+ guard case . edited = managedDependency. state else { continue }
1411
+
1412
+ let constraint = PackageContainerConstraint ( package : managedDependency. package ,
1413
+ requirement: . unversioned,
1414
+ products: productFilter)
1434
1415
constraints. append ( constraint)
1435
1416
}
1436
1417
return constraints
@@ -1476,6 +1457,8 @@ extension Workspace {
1476
1457
return path
1477
1458
case . local:
1478
1459
return AbsolutePath ( dependency. package . location)
1460
+ case . downloaded( version: let version) :
1461
+ return self . location. sourceArchiveDirectory ( for: dependency. package , at: version)
1479
1462
}
1480
1463
}
1481
1464
@@ -1619,6 +1602,9 @@ extension Workspace {
1619
1602
default :
1620
1603
version = . none
1621
1604
}
1605
+ case . downloaded( version: let downloadedVersion) :
1606
+ packageKind = . remote
1607
+ version = downloadedVersion
1622
1608
case . edited, . local:
1623
1609
packageKind = . local
1624
1610
version = . none
@@ -2077,15 +2063,13 @@ extension Workspace {
2077
2063
// We require cloning if there is no checkout or if the checkout doesn't
2078
2064
// match with the pin.
2079
2065
let requiredPins = pinsStore. pins. filter { pin in
2080
- guard let dependency = state. dependencies [ pin. packageRef. identity] else {
2081
- return true
2082
- }
2083
- switch dependency. state {
2084
- case . checkout( let checkoutState) :
2085
- return pin. state != checkoutState
2086
- case . edited, . local:
2066
+ guard let dependency = state. dependencies [ pin. packageRef. identity] ,
2067
+ case . checkout( let checkoutState) = dependency. state
2068
+ else {
2087
2069
return true
2088
2070
}
2071
+
2072
+ return pin. state != checkoutState
2089
2073
}
2090
2074
2091
2075
// Clone the required pins.
@@ -2334,8 +2318,8 @@ extension Workspace {
2334
2318
2335
2319
for dependency in state. dependencies {
2336
2320
switch dependency. state {
2337
- case . checkout: break
2338
- case . edited , . local : continue
2321
+ case . checkout, . downloaded : break
2322
+ default : continue
2339
2323
}
2340
2324
2341
2325
let identity = dependency. package . identity
@@ -2488,6 +2472,8 @@ extension Workspace {
2488
2472
case . checkout:
2489
2473
let newState = PackageStateChange . State ( requirement: . unversioned, products: products)
2490
2474
packageStateChanges [ packageRef. location] = ( packageRef, . updated( newState) )
2475
+ case . downloaded:
2476
+ throw InternalError ( " downloaded package must be versioned " )
2491
2477
}
2492
2478
} else {
2493
2479
let newState = PackageStateChange . State ( requirement: . unversioned, products: products)
@@ -2536,16 +2522,16 @@ extension Workspace {
2536
2522
}
2537
2523
2538
2524
case . version( let version) :
2539
- if let currentDependency = currentDependency {
2540
- if case . checkout( let checkoutState) = currentDependency. state, case . version( version, _) = checkoutState {
2541
- packageStateChanges [ packageRef. location] = ( packageRef, . unchanged)
2542
- } else {
2543
- let newState = PackageStateChange . State ( requirement: . version( version) , products: products)
2544
- packageStateChanges [ packageRef. location] = ( packageRef, . updated( newState) )
2545
- }
2546
- } else {
2525
+ switch currentDependency? . state {
2526
+ case nil :
2547
2527
let newState = PackageStateChange . State ( requirement: . version( version) , products: products)
2548
2528
packageStateChanges [ packageRef. location] = ( packageRef, . added( newState) )
2529
+ case . checkout( . version( version, _) ) ? ,
2530
+ . downloaded( version) ? :
2531
+ packageStateChanges [ packageRef. location] = ( packageRef, . unchanged)
2532
+ default :
2533
+ let newState = PackageStateChange . State ( requirement: . version( version) , products: products)
2534
+ packageStateChanges [ packageRef. location] = ( packageRef, . updated( newState) )
2549
2535
}
2550
2536
}
2551
2537
}
@@ -2634,6 +2620,10 @@ extension Workspace {
2634
2620
2635
2621
diagnostics. emit ( . editedDependencyMissing( packageName: dependency. package . name) )
2636
2622
2623
+ case . downloaded( version: let version) :
2624
+ _ = try temp_await { registryManager? . downloadSourceArchive ( for: version, of: dependency. package , into: fileSystem, at: path ( to: dependency) , expectedChecksum: nil , on: . sharedConcurrent, completion: $0) }
2625
+ diagnostics. emit ( . downloadedDependencyMissing( packageName: dependency. package . name, version: version) )
2626
+
2637
2627
case . local:
2638
2628
state. dependencies. remove ( dependency)
2639
2629
try state. saveState ( )
@@ -2842,13 +2832,10 @@ extension Workspace {
2842
2832
// a local package.
2843
2833
//
2844
2834
// Note that we don't actually remove a local package from disk.
2845
- switch dependency. state {
2846
- case . local:
2835
+ if case . local = dependency. state {
2847
2836
state. dependencies. remove ( dependency)
2848
2837
try state. saveState ( )
2849
2838
return
2850
- case . checkout, . edited:
2851
- break
2852
2839
}
2853
2840
2854
2841
// Inform the delegate.
@@ -2913,6 +2900,8 @@ extension Workspace {
2913
2900
result. append ( " edited " )
2914
2901
case . local? :
2915
2902
result. append ( " versioned " )
2903
+ case . downloaded? :
2904
+ result. append ( " downloaded " )
2916
2905
case nil :
2917
2906
result. append ( " root " )
2918
2907
}
0 commit comments