@@ -1114,7 +1114,7 @@ extension Workspace {
11141114 root: PackageGraphRootInput ? = nil ,
11151115 diagnostics: DiagnosticsEngine
11161116 ) throws {
1117- guard case . edited( let editedState) = dependency. state else {
1117+ guard case let . edited( basedOn , editedState) = dependency. state else {
11181118 throw WorkspaceDiagnostics . DependencyNotInEditMode ( dependencyName: dependency. package . name)
11191119 }
11201120
@@ -1144,7 +1144,8 @@ extension Workspace {
11441144 try fileSystem. removeFileTree ( self . location. editsDirectory)
11451145 }
11461146
1147- if case . checkout( let checkoutState) = dependency. basedOn? . state {
1147+
1148+ if case . checkout( let checkoutState) = basedOn. state {
11481149 // Restore the original checkout.
11491150 //
11501151 // The clone method will automatically update the managed dependency state.
@@ -1469,9 +1470,9 @@ extension Workspace {
14691470 switch dependency. state {
14701471 case . checkout:
14711472 return self . location. repositoryCheckoutDirectory ( for: dependency. package )
1472- case . edited( . managed) :
1473- return self . location. editDirectory ( for: dependency . package )
1474- case . edited( . unmanaged( let path) ) :
1473+ case . edited( basedOn : let basedOn , . managed) :
1474+ return self . location. editDirectory ( for: basedOn . package )
1475+ case . edited( _ , . unmanaged( let path) ) :
14751476 return path
14761477 case . local:
14771478 return AbsolutePath ( dependency. package . location)
@@ -2457,13 +2458,14 @@ extension Workspace {
24572458 // original checkout in somewhat of a dangling state when computing
24582459 // the state changes this method. We basically need to ensure that
24592460 // the edited checkout is unchanged.
2460- if let editedDependency = state. dependencies. first ( where: {
2461- guard $0 . basedOn != nil else { return false }
2462- return self . path ( to: $0 ) . pathString == packageRef. location
2461+ if let editedDependency = state. dependencies. first ( where: { dependency in
2462+ guard case . edited = dependency . state else { return false }
2463+ return self . path ( to: dependency ) . pathString == packageRef. location
24632464 } ) {
24642465 currentDependency = editedDependency
2465- let originalReference = editedDependency. basedOn!. package // forced unwrap safe
2466- packageStateChanges [ originalReference. location] = ( originalReference, . unchanged)
2466+ if case . edited( basedOn: let original, _) = editedDependency. state {
2467+ packageStateChanges [ original. package . location] = ( original. package , . unchanged)
2468+ }
24672469 } else {
24682470 currentDependency = nil
24692471 }
@@ -2832,7 +2834,7 @@ extension Workspace {
28322834
28332835 /// Removes the clone and checkout of the provided specifier.
28342836 fileprivate func remove( package : PackageReference ) throws {
2835- guard let dependency = state. dependencies [ package . identity] else {
2837+ guard var dependency = state. dependencies [ package . identity] else {
28362838 throw InternalError ( " trying to remove \( package . name) which isn't in workspace " )
28372839 }
28382840
@@ -2855,10 +2857,10 @@ extension Workspace {
28552857 // Compute the dependency which we need to remove.
28562858 let dependencyToRemove : ManagedDependency
28572859
2858- if let basedOn = dependency. basedOn {
2860+ if case . edited ( basedOn: let original , _ ) = dependency. state {
28592861 // Remove the underlying dependency for edited packages.
2860- dependencyToRemove = basedOn
2861- dependency. basedOn = nil
2862+ dependencyToRemove = original
2863+ dependency = ManagedDependency ( package : package , state : original . state )
28622864 state. dependencies. add ( dependency)
28632865 } else {
28642866 dependencyToRemove = dependency
0 commit comments