Handle file rescan (#2951)

* Fire handlers when file updated or moved
* Create galleries as needed
* Clean empty galleries
* Handle cleaning zip folders when path changed
* Fix gallery association on duplicate images
* Re-create missing folder-based galleries
This commit is contained in:
WithoutPants
2022-09-28 16:08:00 +10:00
committed by GitHub
parent 00820a8789
commit dce90a3ed9
13 changed files with 439 additions and 106 deletions

View File

@@ -13,6 +13,7 @@ const (
type hookManager struct {
postCommitHooks []TxnFunc
postRollbackHooks []TxnFunc
postCompleteHooks []TxnFunc
}
func (m *hookManager) register(ctx context.Context) context.Context {
@@ -27,20 +28,26 @@ func hookManagerCtx(ctx context.Context) *hookManager {
return m
}
func executePostCommitHooks(ctx context.Context) {
m := hookManagerCtx(ctx)
for _, h := range m.postCommitHooks {
func executeHooks(ctx context.Context, hooks []TxnFunc) {
for _, h := range hooks {
// ignore errors
_ = h(ctx)
}
}
func executePostCommitHooks(ctx context.Context) {
m := hookManagerCtx(ctx)
executeHooks(ctx, m.postCommitHooks)
}
func executePostRollbackHooks(ctx context.Context) {
m := hookManagerCtx(ctx)
for _, h := range m.postRollbackHooks {
// ignore errors
_ = h(ctx)
}
executeHooks(ctx, m.postRollbackHooks)
}
func executePostCompleteHooks(ctx context.Context) {
m := hookManagerCtx(ctx)
executeHooks(ctx, m.postCompleteHooks)
}
func AddPostCommitHook(ctx context.Context, hook TxnFunc) {
@@ -52,3 +59,8 @@ func AddPostRollbackHook(ctx context.Context, hook TxnFunc) {
m := hookManagerCtx(ctx)
m.postRollbackHooks = append(m.postRollbackHooks, hook)
}
func AddPostCompleteHook(ctx context.Context, hook TxnFunc) {
m := hookManagerCtx(ctx)
m.postCompleteHooks = append(m.postCompleteHooks, hook)
}

View File

@@ -22,6 +22,11 @@ type TxnFunc func(ctx context.Context) error
// WithTxn executes fn in a transaction. If fn returns an error then
// the transaction is rolled back. Otherwise it is committed.
func WithTxn(ctx context.Context, m Manager, fn TxnFunc) error {
const execComplete = true
return withTxn(ctx, m, fn, execComplete)
}
func withTxn(ctx context.Context, m Manager, fn TxnFunc, execCompleteOnLocked bool) error {
var err error
ctx, err = begin(ctx, m)
if err != nil {
@@ -38,10 +43,16 @@ func WithTxn(ctx context.Context, m Manager, fn TxnFunc) error {
if err != nil {
// something went wrong, rollback
rollback(ctx, m)
if execCompleteOnLocked || !m.IsLocked(err) {
executePostCompleteHooks(ctx)
}
} else {
// all good, commit
err = commit(ctx, m)
executePostCompleteHooks(ctx)
}
}()
err = fn(ctx)
@@ -102,7 +113,8 @@ func (r Retryer) WithTxn(ctx context.Context, fn TxnFunc) error {
var attempt int
var err error
for attempt = 1; attempt <= r.Retries || r.Retries < 0; attempt++ {
err = WithTxn(ctx, r.Manager, fn)
const execComplete = false
err = withTxn(ctx, r.Manager, fn, execComplete)
if err == nil {
return nil