@@ -208,3 +208,49 @@ func DeletePackageFile(ctx *context.Context) {
208208
209209 ctx .Status (http .StatusNoContent )
210210}
211+
212+ // LockPackage locks the specific terraform state.
213+ func LockPackage (ctx * context.Context ) {
214+ packageName := ctx .PathParam ("packagename" )
215+ pv , err := packages_model .GetVersionByNameAndVersion (ctx , ctx .Package .Owner .ID , packages_model .TypeTerraform , packageName , ctx .PathParam ("filename" ))
216+ if err != nil {
217+ if errors .Is (err , packages_model .ErrPackageNotExist ) || errors .Is (err , packages_model .ErrPackageFileNotExist ) {
218+ apiError (ctx , http .StatusNotFound , err )
219+ return
220+ }
221+ apiError (ctx , http .StatusInternalServerError , err )
222+ return
223+ }
224+
225+ //log.Error("pv: %+v", pv)
226+ ok , _ , err := globallock .TryLock (ctx , fmt .Sprintf ("%s/%s" , packageName , pv .LowerVersion ))
227+ if err != nil {
228+ apiError (ctx , http .StatusInternalServerError , err )
229+ return
230+ }
231+ if ! ok {
232+ apiError (ctx , http .StatusLocked , err )
233+ return
234+ }
235+
236+ ctx .Status (http .StatusOK )
237+ }
238+
239+ // UnlockPackage unlock the specific terraform state.
240+ func UnlockPackage (ctx * context.Context ) {
241+ packageName := ctx .PathParam ("packagename" )
242+ pv , err := packages_model .GetVersionByNameAndVersion (ctx , ctx .Package .Owner .ID , packages_model .TypeTerraform , packageName , ctx .PathParam ("filename" ))
243+ if err != nil {
244+ if errors .Is (err , packages_model .ErrPackageNotExist ) || errors .Is (err , packages_model .ErrPackageFileNotExist ) {
245+ apiError (ctx , http .StatusNotFound , err )
246+ return
247+ }
248+ apiError (ctx , http .StatusInternalServerError , err )
249+ return
250+ }
251+
252+ //log.Error("pv: %+v", pv)
253+ _ = globallock .Unlock (ctx , fmt .Sprintf ("%s/%s" , packageName , pv .LowerVersion ))
254+
255+ ctx .Status (http .StatusOK )
256+ }
0 commit comments