Module: GitFit::Cli::Sync

Included in:
GitFit::CLI
Defined in:
lib/git_fit/cli/sync.rb

Instance Method Summary collapse

Instance Method Details

#auth(source) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/git_fit/cli/sync.rb', line 34

def auth(source)
  sources = %w[garmin garmin_cn strava]
  unless sources.include?(source)
    say_status :error, "Supported: #{sources.join(', ')}", :red
    return
  end

  config = git_fit_config.sync_config(source)
  if config.empty?
    say_status :warn, "No config for #{source}. Set env vars or config.yml", :yellow
    return
  end

  adapter = build_auth_adapter(source)
  unless adapter.respond_to?(:authenticate)
    say_status :error, "#{source} does not support interactive auth", :red
    return
  end

  say_status :auth, "Logging in to #{source}...", :green
  if adapter.authenticate
    say_status :done, "#{source} authenticated successfully", :green
    if adapter.respond_to?(:generated_secret) && (secret = adapter.generated_secret)
      puts ''
      puts 'GitHub Actions Secrets:'
      puts "  SYNC_#{source.upcase}_SECRET = #{secret}"
      puts "  SYNC_#{source.upcase}_EMAIL  = #{config['email']}"
      puts "  SYNC_#{source.upcase}_PASSWORD = #{config['password']}"
      puts ''
      puts 'Local config:'
      puts "  #{source}:"
      puts "    secret: (已自动写入 #{GitFit::Config.default_path})"
    end
  else
    say_status :error, 'Authentication failed', :red
  end
rescue GitFit::Sync::AuthError => e
  say_status :error, "Authentication failed: #{e.message}", :red
end

#syncObject



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/git_fit/cli/sync.rb', line 6

def sync
  db = connect_db
  source = options[:source]
  filter = options[:activity]&.flat_map { |v| v.split(',') }&.map(&:strip)&.map(&:downcase)
  privacy = GitFit::Privacy::PolylineFilter.new(config: git_fit_config.privacy_config)

  sources = if source
    [source]
  else
    (git_fit_config['sync'] || {}).select { |_k, v| v.is_a?(Hash) }.keys
  end

  runner = GitFit::Sync::Runner.new(
    sources: sources,
    db: db,
    config: git_fit_config,
    activity_filter: filter,
    privacy: privacy,
    num_workers: git_fit_config.dig('sync', 'workers') || 3,
    time_budget: git_fit_config.dig('sync', 'time_budget'),
    total_timeout: git_fit_config.dig('sync', 'total_timeout')
  )
  runner.run
  checkpoint_db(db) if options[:checkpoint]
rescue StandardError => e
say_status :error, e.message, :red
end