@ -614,7 +614,7 @@ func Edit(ctx *context.APIContext) {
}
if opts . MirrorInterval != nil {
if err := updateMirrorInterval ( ctx , opts ) ; err != nil {
if err := updateMirror ( ctx , opts ) ; err != nil {
return
}
}
@ -943,37 +943,67 @@ func updateRepoArchivedState(ctx *context.APIContext, opts api.EditRepoOption) e
return nil
}
// updateMirrorInterval updates the repo's mirror Interval
func updateMirrorInterval ( ctx * context . APIContext , opts api . EditRepoOption ) error {
// updateMirror updates a repo's mirror Interval and EnablePrune
func updateMirror ( ctx * context . APIContext , opts api . EditRepoOption ) error {
repo := ctx . Repo . Repository
// only update mirror if interval or enable prune are provided
if opts . MirrorInterval == nil && opts . EnablePrune == nil {
return nil
}
// these values only make sense if the repo is a mirror
if ! repo . IsMirror {
err := fmt . Errorf ( "repo is not a mirror, can not change mirror interval" )
ctx . Error ( http . StatusUnprocessableEntity , err . Error ( ) , err )
return err
}
// get the mirror from the repo
mirror , err := repo_model . GetMirrorByRepoID ( repo . ID )
if err != nil {
log . Error ( "Failed to get mirror: %s" , err )
ctx . Error ( http . StatusInternalServerError , "MirrorInterval" , err )
return err
}
// update MirrorInterval
if opts . MirrorInterval != nil {
if ! repo . IsMirror {
err := fmt . Errorf ( "repo is not a mirror, can not change mirror interval" )
ctx . Error ( http . StatusUnprocessableEntity , err . Error ( ) , err )
return err
}
mirror , err := repo_model . GetMirrorByRepoID ( repo . ID )
// MirrorInterval should be a duration
interval , err := time . ParseDuration ( * opts . MirrorInterval )
if err != nil {
log . Error ( "Failed to get mirror: %s" , err )
ctx . Error ( http . StatusInternalServerError , "MirrorInterval" , err )
log . Error ( "Wrong format for MirrorInternal Sent: %s" , err )
ctx . Error ( http . StatusUnprocessableEntity , "MirrorInterval" , err )
return err
}
if interval , err := time . ParseDuration ( * opts . MirrorInterval ) ; err == nil {
mirror . Interval = interval
mirror . Repo = repo
if err := repo_model . UpdateMirror ( mirror ) ; err != nil {
log . Error ( "Failed to Set Mirror Interval: %s" , err )
ctx . Error ( http . StatusUnprocessableEntity , "MirrorInterval" , err )
return err
}
log . Trace ( "Repository %s/%s Mirror Interval was Updated to %s" , ctx . Repo . Owner . Name , repo . Name , interval )
} else {
log . Error ( "Wrong format for MirrorInternal Sent: %s" , err )
// Ensure the provided duration is not too short
if interval != 0 && interval < setting . Mirror . MinInterval {
err := fmt . Errorf ( "invalid mirror interval: %s is below minimum interval: %s" , interval , setting . Mirror . MinInterval )
ctx . Error ( http . StatusUnprocessableEntity , "MirrorInterval" , err )
return err
}
mirror . Interval = interval
mirror . Repo = repo
mirror . ScheduleNextUpdate ( )
log . Trace ( "Repository %s Mirror[%d] Set Interval: %s NextUpdateUnix: %s" , repo . FullName ( ) , mirror . ID , interval , mirror . NextUpdateUnix )
}
// update EnablePrune
if opts . EnablePrune != nil {
mirror . EnablePrune = * opts . EnablePrune
log . Trace ( "Repository %s Mirror[%d] Set EnablePrune: %t" , repo . FullName ( ) , mirror . ID , mirror . EnablePrune )
}
// finally update the mirror in the DB
if err := repo_model . UpdateMirror ( mirror ) ; err != nil {
log . Error ( "Failed to Set Mirror Interval: %s" , err )
ctx . Error ( http . StatusUnprocessableEntity , "MirrorInterval" , err )
return err
}
return nil
}