返回 DeepSeek-Reasonix
historical_source_lock.go
根目录 / desktop / historical_source_lock.go
1 package main
2
3 import (
4 "context"
5 "os"
6 "path/filepath"
7 "reasonix/internal/identitylock"
8 )
9
10 func acquireHistoricalSource(ctx context.Context, id string, source historicalSource) (func(), error) {
11 if err := ctx.Err(); err != nil {
12 return nil, err
13 }
14 lockDir := filepath.Join(desktopConfigDir(), "desktop", "historical-import-locks")
15 if err := os.MkdirAll(lockDir, 0700); err != nil {
16 return nil, err
17 }
18 lockKey := desktopSourceKey(source.path, source.head)
19 release, err := identitylock.TryAcquire(filepath.Join(lockDir, lockKey+".lock"))
20 if err != nil {
21 return nil, err
22 }
23 if source.format != "canonical" {
24 return release, nil
25 }
26 ownership, err := acquireHistoricalCanonicalRead(source.path)
27 if err != nil {
28 release()
29 return nil, err
30 }
31 return func() { ownership(); release() }, nil
32 }
33
34 func acquireHistoricalCanonicalRead(path string) (func(), error) {
35 ownership, err := identitylock.TryAcquireMode(filepath.Join(filepath.Dir(path), "."+filepath.Base(path)+".ownership.lock"), identitylock.ModeShared)
36 if err != nil {
37 return nil, err
38 }
39 writer, err := identitylock.TryAcquireMode(filepath.Join(path, "writer.lock"), identitylock.ModeShared)
40 if err != nil {
41 ownership()
42 return nil, err
43 }
44 return func() { writer(); ownership() }, nil
45 }
46
46 lines GO