Skip to content

Commit 65a53b9

Browse files
authored
Merge pull request #496 from rusq/conn-pool
Preps for v3.1.0-alpha
2 parents 55b550e + 2e48177 commit 65a53b9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+994
-556
lines changed

TODO.org

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
* V3.1
2-
** TODO Database backend
2+
** DONE Database backend
3+
CLOSED: [2025-04-08 Tue 21:54]
34
*** DONE Add database backend support to Dump converter, it relies on the files
45
*** DONE Check if the thread export works as intended.
56
*** DONE Conversion to and from.
67
CLOSED: [2025-03-11 Tue 20:53]
78
*** DONE Files and avatars support during conversion.
89
CLOSED: [2025-03-14 Fri 21:33]
9-
*** TODO Tests for dbproc and related packages.
10+
*** DONE Tests for dbproc and related packages.
11+
CLOSED: [2025-04-08 Tue 21:54]
1012
**** DONE repository
1113
CLOSED: [2025-03-23 Sun 21:40]
1214
**** DONE control
1315
CLOSED: [2025-03-23 Sun 21:40]
14-
**** TODO dbproc
16+
**** DONE dbproc
17+
CLOSED: [2025-04-08 Tue 21:53]
1518
*** DONE Resume will choke on export->database converted workspaces due to
1619
CLOSED: [2025-03-26 Wed 19:35]
1720
missing "workspace" information. Find another way to verify the
1821
workspace name, possibly by team ID on the messages/users.
19-
*** TODO Info command, prints out the database sessions, workspaces and message stats.
2022
** DONE Source detection
2123
CLOSED: [2025-03-14 Fri 21:34]
2224
*** DONE detect standard file storage
@@ -35,24 +37,48 @@
3537
** DONE Verify that consequent calls of conversation.replies don't have the first thread message as the item with 0-index.
3638
CLOSED: [2025-03-16 Sun 22:01]
3739
Yes it does: https://github.com/rusq/slackdump/issues/128#issuecomment-1234773510
38-
** DONE Only participating users #287.
40+
** DONE Only participating users #287, #125.
3941
CLOSED: [2025-03-21 Fri 22:05]
40-
** TODO Attachment filter, use the same terms as channel filter, -filter-files=[public,private,dm] (#233)
41-
** TODO Channel filter (private/public/DMs) -filter-channel=[public,private,dm] (controller already supports this)
42-
** Resume
42+
Also solves #108 - dumping users with guest role.
43+
** DONE Resume
44+
CLOSED: [2025-04-08 Tue 21:54]
4345
*** DONE user_not_found error when running with -channel-users
4446
CLOSED: [2025-03-21 Fri 22:32]
4547
*** DONE when resuming with -channel-users, and there are no new messages, the resume crashes with "no users collected"
4648
CLOSED: [2025-03-21 Fri 22:32]
49+
** DONE Formatter for all type of source data
50+
CLOSED: [2025-04-08 Tue 21:55]
51+
** DONE Optional emoji download (-files=false) for emoji command
52+
** DONE Log colorisation (and output to stderr) (#467)
53+
CLOSED: [2025-04-08 Tue 22:03]
54+
** DONE Converter from early v1.0.x format (as a tool subcommand)
55+
CLOSED: [2025-04-08 Tue 22:02]
56+
57+
** Fixes
58+
*** DONE Some attachment IDs can be strings, not just integers (#491, #492)
59+
CLOSED: [2025-04-08 Tue 21:58]
60+
*** DONE Some bot messages caused panic (#482)
61+
CLOSED: [2025-04-08 Tue 21:59]
62+
*** DONE Lack of synchronisation between Generator goroutine and controller, causing panic on premature termination (#479)
63+
CLOSED: [2025-04-08 Tue 21:59]
64+
*** DONE Properly handle UnexpectedEOF error (#468)
65+
CLOSED: [2025-04-08 Tue 22:03]
66+
*** DONE Parsing of the enterprise URLs (#461)
67+
CLOSED: [2025-04-08 Tue 22:06]
4768
* V3.2
48-
** TODO Starred items and bookmarks.
69+
** Filters
70+
*** TODO Channel filter (private/public/DMs) -filter-channel=[public,private,dm] (controller already supports this)
71+
*** TODO Attachment filter, use the same terms as channel filter, -filter-files=[public,private,dm] (#233)
72+
** TODO bookmarks support
73+
** TODO Saved items
4974
** TODO Connection pooling
5075
** TODO load emojis alongside the messages during archive.
5176
** TODO Static viewer output #416
5277
** TODO Thumbnail download (#111)
5378
** TODO Custom fields for users (#62)
79+
** TODO Info command, prints out the database sessions, workspaces and message stats.
80+
** TODO Aliasing users in the viewer, click on the username, assign a name, save (for archive source only).
5481
* Future
55-
** TODO Aliasing users in the viewer, click on the username, assign a name, save.
5682
** TODO detect external users and fetch them individually
5783
even if running without -channel-users.
5884
** TODO export compatibility (?)

cmd/slackdump/internal/archive/archive.go

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
"github.com/jmoiron/sqlx"
1414
"github.com/rusq/fsadapter"
1515

16-
"github.com/rusq/slackdump/v3"
1716
"github.com/rusq/slackdump/v3/cmd/slackdump/internal/bootstrap"
1817
"github.com/rusq/slackdump/v3/cmd/slackdump/internal/cfg"
1918
"github.com/rusq/slackdump/v3/cmd/slackdump/internal/golang/base"
@@ -22,6 +21,7 @@ import (
2221
"github.com/rusq/slackdump/v3/internal/chunk/backend/dbase/repository"
2322
"github.com/rusq/slackdump/v3/internal/chunk/backend/directory"
2423
"github.com/rusq/slackdump/v3/internal/chunk/control"
24+
"github.com/rusq/slackdump/v3/internal/client"
2525
"github.com/rusq/slackdump/v3/internal/convert/transform/fileproc"
2626
"github.com/rusq/slackdump/v3/internal/structures"
2727
"github.com/rusq/slackdump/v3/stream"
@@ -61,7 +61,7 @@ func runChunkArchive(ctx context.Context, _ *base.Command, args []string) error
6161
base.SetExitStatus(base.SUserError)
6262
return err
6363
}
64-
sess, err := bootstrap.SlackdumpSession(ctx)
64+
client, err := bootstrap.Slack(ctx)
6565
if err != nil {
6666
base.SetExitStatus(base.SInitializationError)
6767
return err
@@ -73,7 +73,7 @@ func runChunkArchive(ctx context.Context, _ *base.Command, args []string) error
7373
}
7474
defer cd.Close()
7575

76-
ctrl, err := ArchiveController(ctx, cd, sess)
76+
ctrl, err := ArchiveController(ctx, cd, client)
7777
if err != nil {
7878
return err
7979
}
@@ -93,7 +93,7 @@ func runDBArchive(ctx context.Context, cmd *base.Command, args []string) error {
9393
base.SetExitStatus(base.SUserError)
9494
return err
9595
}
96-
sess, err := bootstrap.SlackdumpSession(ctx)
96+
client, err := bootstrap.Slack(ctx)
9797
if err != nil {
9898
base.SetExitStatus(base.SInitializationError)
9999
return err
@@ -112,7 +112,7 @@ func runDBArchive(ctx context.Context, cmd *base.Command, args []string) error {
112112

113113
flags := control.Flags{MemberOnly: cfg.MemberOnly, RecordFiles: cfg.RecordFiles, ChannelUsers: cfg.OnlyChannelUsers}
114114

115-
ctrl, err := DBController(ctx, cmd, conn, sess, dirname, flags)
115+
ctrl, err := DBController(ctx, cmd, conn, client, dirname, flags)
116116
if err != nil {
117117
return err
118118
}
@@ -150,7 +150,7 @@ func NewDirectory(name string) (*chunk.Directory, error) {
150150
// parameters.
151151
//
152152
// Obscene, just obscene amount of arguments.
153-
func DBController(ctx context.Context, cmd *base.Command, conn *sqlx.DB, sess *slackdump.Session, dirname string, flags control.Flags, opts ...stream.Option) (RunCloser, error) {
153+
func DBController(ctx context.Context, cmd *base.Command, conn *sqlx.DB, client client.Slack, dirname string, flags control.Flags, opts ...stream.Option) (RunCloser, error) {
154154
lg := cfg.Log
155155
dbp, err := dbase.New(ctx, conn, bootstrap.SessionInfo(cmd.Name()))
156156
if err != nil {
@@ -166,22 +166,22 @@ func DBController(ctx context.Context, cmd *base.Command, conn *sqlx.DB, sess *s
166166
dl := fileproc.NewDownloader(
167167
ctx,
168168
cfg.WithFiles,
169-
sess.Client(),
169+
client,
170170
fsadapter.NewDirectory(dirname),
171171
lg,
172172
)
173173
// start avatar downloader
174174
avdl := fileproc.NewDownloader(
175175
ctx,
176176
cfg.WithAvatars,
177-
sess.Client(),
177+
client,
178178
fsadapter.NewDirectory(dirname),
179179
lg,
180180
)
181181

182182
ctrl, err := control.New(
183183
ctx,
184-
sess.Stream(sopts...),
184+
stream.New(client, cfg.Limits, sopts...),
185185
dbp,
186186
control.WithFiler(fileproc.New(dl)),
187187
control.WithAvatarProcessor(fileproc.NewAvatarProc(avdl)),
@@ -200,7 +200,7 @@ type RunCloser interface {
200200

201201
// ArchiveController returns the default archive controller initialised based
202202
// on global configuration parameters.
203-
func ArchiveController(ctx context.Context, cd *chunk.Directory, sess *slackdump.Session, opts ...stream.Option) (*control.Controller, error) {
203+
func ArchiveController(ctx context.Context, cd *chunk.Directory, client client.Slack, opts ...stream.Option) (*control.Controller, error) {
204204
lg := cfg.Log
205205

206206
sopts := []stream.Option{
@@ -214,15 +214,15 @@ func ArchiveController(ctx context.Context, cd *chunk.Directory, sess *slackdump
214214
dl := fileproc.NewDownloader(
215215
ctx,
216216
cfg.WithFiles,
217-
sess.Client(),
217+
client,
218218
fsadapter.NewDirectory(cd.Name()),
219219
lg,
220220
)
221221
// start avatar downloader
222222
avdl := fileproc.NewDownloader(
223223
ctx,
224224
cfg.WithAvatars,
225-
sess.Client(),
225+
client,
226226
fsadapter.NewDirectory(cd.Name()),
227227
lg,
228228
)
@@ -231,7 +231,7 @@ func ArchiveController(ctx context.Context, cd *chunk.Directory, sess *slackdump
231231

232232
ctrl, err := control.New(
233233
ctx,
234-
sess.Stream(sopts...),
234+
stream.New(client, cfg.Limits, sopts...),
235235
erc,
236236
control.WithLogger(lg),
237237
control.WithFlags(control.Flags{MemberOnly: cfg.MemberOnly, RecordFiles: cfg.RecordFiles, ChannelUsers: cfg.OnlyChannelUsers}),
@@ -242,14 +242,6 @@ func ArchiveController(ctx context.Context, cd *chunk.Directory, sess *slackdump
242242
return nil, err
243243
}
244244

245-
// ctrl := control.NewDir(
246-
// cd,
247-
// sess.Stream(sopts...),
248-
// control.WithLogger(lg),
249-
// control.WithFlags(control.Flags{MemberOnly: cfg.MemberOnly, RecordFiles: cfg.RecordFiles}),
250-
// control.WithFiler(fileproc.New(dl)),
251-
// control.WithAvatarProcessor(fileproc.NewAvatarProc(avdl)),
252-
// )
253245
return ctrl, nil
254246
}
255247

cmd/slackdump/internal/archive/search.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,16 @@ import (
77
"strings"
88
"sync"
99

10-
fileproc2 "github.com/rusq/slackdump/v3/internal/convert/transform/fileproc"
11-
12-
"github.com/rusq/slackdump/v3/internal/chunk/backend/dbase"
13-
1410
"github.com/rusq/fsadapter"
1511
"github.com/schollz/progressbar/v3"
1612

17-
"github.com/rusq/slackdump/v3"
1813
"github.com/rusq/slackdump/v3/cmd/slackdump/internal/bootstrap"
1914
"github.com/rusq/slackdump/v3/cmd/slackdump/internal/cfg"
2015
"github.com/rusq/slackdump/v3/cmd/slackdump/internal/golang/base"
16+
"github.com/rusq/slackdump/v3/internal/chunk/backend/dbase"
2117
"github.com/rusq/slackdump/v3/internal/chunk/control"
18+
"github.com/rusq/slackdump/v3/internal/client"
19+
"github.com/rusq/slackdump/v3/internal/convert/transform/fileproc"
2220
"github.com/rusq/slackdump/v3/stream"
2321
)
2422

@@ -100,13 +98,13 @@ func runSearch(ctx context.Context, cmd *base.Command, args []string, typ contro
10098

10199
cfg.Log.Info("running command", "cmd", cmd.Name())
102100

103-
sess, err := bootstrap.SlackdumpSession(ctx)
101+
client, err := bootstrap.Slack(ctx)
104102
if err != nil {
105103
base.SetExitStatus(base.SInitializationError)
106104
return err
107105
}
108106

109-
ctrl, stop, err := searchControllerv31(ctx, cfg.Output, sess, args)
107+
ctrl, stop, err := searchControllerv31(ctx, cfg.Output, client, args)
110108
if err != nil {
111109
base.SetExitStatus(base.SApplicationError)
112110
return err
@@ -138,7 +136,7 @@ func (s stopFn) Stop() error {
138136
return err
139137
}
140138

141-
func searchControllerv31(ctx context.Context, dir string, sess *slackdump.Session, terms []string) (*control.Controller, stopFn, error) {
139+
func searchControllerv31(ctx context.Context, dir string, client client.Slack, terms []string) (*control.Controller, stopFn, error) {
142140
var stop stopFn
143141
if len(terms) == 0 {
144142
base.SetExitStatus(base.SInvalidParameters)
@@ -158,10 +156,10 @@ func searchControllerv31(ctx context.Context, dir string, sess *slackdump.Sessio
158156

159157
lg := cfg.Log
160158

161-
dl := fileproc2.NewDownloader(
159+
dl := fileproc.NewDownloader(
162160
ctx,
163161
cfg.WithFiles,
164-
sess.Client(),
162+
client,
165163
fsadapter.NewDirectory(cd.Name()),
166164
lg,
167165
)
@@ -189,10 +187,10 @@ func searchControllerv31(ctx context.Context, dir string, sess *slackdump.Sessio
189187

190188
ctrl, err := control.New(
191189
ctx,
192-
sess.Stream(sopts...),
190+
stream.New(client, cfg.Limits, sopts...),
193191
erc,
194192
control.WithLogger(lg),
195-
control.WithFiler(fileproc2.New(dl)),
193+
control.WithFiler(fileproc.New(dl)),
196194
control.WithFlags(control.Flags{RecordFiles: cfg.RecordFiles}),
197195
)
198196
if err != nil {

cmd/slackdump/internal/bootstrap/slackdump.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"github.com/rusq/slackdump/v3"
77
"github.com/rusq/slackdump/v3/auth"
88
"github.com/rusq/slackdump/v3/cmd/slackdump/internal/cfg"
9+
"github.com/rusq/slackdump/v3/internal/client"
910
)
1011

1112
// SlackdumpSession returns the Slackdump Session initialised with the provider
@@ -18,7 +19,7 @@ func SlackdumpSession(ctx context.Context, opts ...slackdump.Option) (*slackdump
1819
return nil, err
1920
}
2021

21-
var stdOpts = []slackdump.Option{
22+
stdOpts := []slackdump.Option{
2223
slackdump.WithLogger(cfg.Log),
2324
slackdump.WithForceEnterprise(cfg.ForceEnterprise),
2425
slackdump.WithLimits(cfg.Limits),
@@ -31,3 +32,18 @@ func SlackdumpSession(ctx context.Context, opts ...slackdump.Option) (*slackdump
3132
stdOpts...,
3233
)
3334
}
35+
36+
// Slack returns the Slack client initialised with the provider from context
37+
// and a standard set of options initialised from the configuration.
38+
func Slack(ctx context.Context, opts ...client.Option) (client.Slack, error) {
39+
prov, err := auth.FromContext(ctx)
40+
if err != nil {
41+
return nil, err
42+
}
43+
opts = append(opts, client.WithEnterprise(cfg.ForceEnterprise))
44+
client, err := client.New(ctx, prov, opts...)
45+
if err != nil {
46+
return nil, err
47+
}
48+
return client, nil
49+
}

cmd/slackdump/internal/convertcmd/convert.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ import (
88
"os"
99
"time"
1010

11+
"github.com/rusq/slackdump/v3/source"
12+
1113
"github.com/rusq/slackdump/v3/cmd/slackdump/internal/cfg"
1214
"github.com/rusq/slackdump/v3/cmd/slackdump/internal/golang/base"
13-
"github.com/rusq/slackdump/v3/internal/source"
1415
)
1516

1617
//go:embed assets/convert.md

cmd/slackdump/internal/convertcmd/to_chunk.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,12 @@ import (
1111
"text/tabwriter"
1212
"time"
1313

14-
"github.com/rusq/slackdump/v3/internal/chunk/backend/directory"
15-
16-
"github.com/rusq/slackdump/v3/internal/chunk/backend/dbase"
17-
"github.com/rusq/slackdump/v3/internal/chunk/backend/dbase/repository"
18-
1914
"github.com/rusq/slackdump/v3/cmd/slackdump/internal/cfg"
2015
"github.com/rusq/slackdump/v3/internal/chunk"
21-
"github.com/rusq/slackdump/v3/internal/source"
16+
"github.com/rusq/slackdump/v3/internal/chunk/backend/dbase"
17+
"github.com/rusq/slackdump/v3/internal/chunk/backend/dbase/repository"
18+
"github.com/rusq/slackdump/v3/internal/chunk/backend/directory"
19+
"github.com/rusq/slackdump/v3/source"
2220
)
2321

2422
func toChunk(ctx context.Context, src, trg string, cflg convertflags) error {

cmd/slackdump/internal/convertcmd/to_database.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,15 @@ import (
66
"os"
77
"path/filepath"
88

9-
"github.com/rusq/fsadapter"
10-
11-
"github.com/rusq/slackdump/v3/internal/chunk/backend/dbase"
12-
"github.com/rusq/slackdump/v3/internal/convert"
13-
149
"github.com/jmoiron/sqlx"
10+
"github.com/rusq/fsadapter"
1511

1612
"github.com/rusq/slackdump/v3/cmd/slackdump/internal/bootstrap"
1713
"github.com/rusq/slackdump/v3/cmd/slackdump/internal/cfg"
1814
"github.com/rusq/slackdump/v3/internal/chunk"
19-
"github.com/rusq/slackdump/v3/internal/source"
15+
"github.com/rusq/slackdump/v3/internal/chunk/backend/dbase"
16+
"github.com/rusq/slackdump/v3/internal/convert"
17+
"github.com/rusq/slackdump/v3/source"
2018
)
2119

2220
// toDatabase converts the source to the database format.

cmd/slackdump/internal/convertcmd/to_dump.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88

99
"github.com/rusq/slackdump/v3/cmd/slackdump/internal/cfg"
1010
"github.com/rusq/slackdump/v3/internal/convert"
11-
"github.com/rusq/slackdump/v3/internal/source"
11+
"github.com/rusq/slackdump/v3/source"
1212
)
1313

1414
var ErrMeaningless = errors.New("meaningless conversion")

0 commit comments

Comments
 (0)