@@ -67,6 +67,9 @@ func postProcessCreatedPlugins(ctx context.Context, plugins []createdPlugin) err
6767 if err := recreateNPMPackageLock (ctx , plugin ); err != nil {
6868 return fmt .Errorf ("failed to recreate package-lock.json for %s: %w" , newPluginRef , err )
6969 }
70+ if err := recreateSwiftPackageResolved (ctx , plugin ); err != nil {
71+ return fmt .Errorf ("failed to resolve Swift package for %s: %w" , newPluginRef , err )
72+ }
7073 }
7174 if err := runPluginTests (ctx , plugins ); err != nil {
7275 return fmt .Errorf ("failed to run plugin tests: %w" , err )
@@ -119,6 +122,97 @@ func recreateNPMPackageLock(ctx context.Context, plugin createdPlugin) error {
119122 return cmd .Run ()
120123}
121124
125+ // recreateSwiftPackageResolved resolves Swift package dependencies for plugins that use Swift packages.
126+ // It clones the git repository specified in the Dockerfile, runs 'swift package resolve',
127+ // and moves the generated Package.resolved file to the version directory.
128+ func recreateSwiftPackageResolved (ctx context.Context , plugin createdPlugin ) error {
129+ versionDir := filepath .Join (plugin .pluginDir , plugin .newVersion )
130+ packageResolved := filepath .Join (versionDir , "Package.resolved" )
131+ _ , err := os .Stat (packageResolved )
132+ if err != nil {
133+ if ! errors .Is (err , fs .ErrNotExist ) {
134+ return err
135+ }
136+ // no Package.resolved to update
137+ return nil
138+ }
139+
140+ // Read the Dockerfile to find the git clone command
141+ dockerfile := filepath .Join (versionDir , "Dockerfile" )
142+ file , err := os .Open (dockerfile )
143+ if err != nil {
144+ return fmt .Errorf ("failed to open Dockerfile: %w" , err )
145+ }
146+ defer file .Close ()
147+
148+ var gitCloneCmd string
149+ scanner := bufio .NewScanner (file )
150+ for scanner .Scan () {
151+ line := scanner .Text ()
152+ if strings .Contains (line , "RUN git clone" ) {
153+ // Strip the "RUN " prefix
154+ gitCloneCmd = strings .TrimSpace (strings .TrimPrefix (line , "RUN " ))
155+ break
156+ }
157+ }
158+ if err := scanner .Err (); err != nil {
159+ return fmt .Errorf ("failed to read Dockerfile: %w" , err )
160+ }
161+ if gitCloneCmd == "" {
162+ return errors .New ("no 'RUN git clone' command found in Dockerfile" )
163+ }
164+
165+ log .Printf ("resolving Swift package for %s/%s:%s" , plugin .org , plugin .name , plugin .newVersion )
166+
167+ // Execute the git clone command
168+ cmd := exec .CommandContext (ctx , "sh" , "-c" , gitCloneCmd )
169+ cmd .Dir = versionDir
170+ cmd .Stdout = os .Stdout
171+ cmd .Stderr = os .Stderr
172+ if err := cmd .Run (); err != nil {
173+ return fmt .Errorf ("failed to run git clone: %w" , err )
174+ }
175+
176+ // Extract the repository name from the git clone command to determine the directory
177+ parts := strings .Fields (gitCloneCmd )
178+ var repoDir string
179+ for _ , part := range parts {
180+ if strings .HasPrefix (part , "https://" ) {
181+ // Extract directory name from URL (e.g., "repo.git" or "repo")
182+ repoName := filepath .Base (part )
183+ repoName = strings .TrimSuffix (repoName , ".git" )
184+ repoDir = filepath .Join (versionDir , repoName )
185+ break
186+ }
187+ }
188+ if repoDir == "" {
189+ return errors .New ("failed to determine repository directory from git clone command" )
190+ }
191+
192+ // Run `swift package resolve` in the cloned directory
193+ cmd = exec .CommandContext (ctx , "swift" , "package" , "resolve" )
194+ cmd .Dir = repoDir
195+ cmd .Stdout = os .Stdout
196+ cmd .Stderr = os .Stderr
197+ if err := cmd .Run (); err != nil {
198+ return fmt .Errorf ("failed to run swift package resolve: %w" , err )
199+ }
200+
201+ // Move the Package.resolved file from the cloned directory to the version directory
202+ src := filepath .Join (repoDir , "Package.resolved" )
203+ dest := packageResolved
204+ if err := os .Rename (src , dest ); err != nil {
205+ return fmt .Errorf ("failed to move Package.resolved: %w" , err )
206+ }
207+
208+ // Remove the cloned repo
209+ if err := os .RemoveAll (repoDir ); err != nil {
210+ return fmt .Errorf ("removing cloned repo: %w" , err )
211+ }
212+
213+ return nil
214+ }
215+
122216// runPluginTests runs 'make test PLUGINS="org/name:v<new>"' in order to generate plugin.sum files.
123217func runPluginTests (ctx context.Context , plugins []createdPlugin ) error {
124218 pluginsEnv := make ([]string , 0 , len (plugins ))
0 commit comments