1use std::sync::Arc;
2
3use git::GitHostingProviderRegistry;
4use gpui::App;
5use settings::{GitHostingProviderConfig, GitHostingProviderKind, Settings, SettingsStore};
6use url::Url;
7use util::ResultExt as _;
8
9use crate::{Bitbucket, Github, Gitlab};
10
11pub(crate) fn init(cx: &mut App) {
12 GitHostingProviderSettings::register(cx);
13
14 init_git_hosting_provider_settings(cx);
15}
16
17fn init_git_hosting_provider_settings(cx: &mut App) {
18 update_git_hosting_providers_from_settings(cx);
19
20 cx.observe_global::<SettingsStore>(update_git_hosting_providers_from_settings)
21 .detach();
22}
23
24fn update_git_hosting_providers_from_settings(cx: &mut App) {
25 let settings_store = cx.global::<SettingsStore>();
26 let settings = GitHostingProviderSettings::get_global(cx);
27 let provider_registry = GitHostingProviderRegistry::global(cx);
28
29 let local_values: Vec<GitHostingProviderConfig> = settings_store
30 .get_all_locals::<GitHostingProviderSettings>()
31 .into_iter()
32 .flat_map(|(_, _, providers)| providers.git_hosting_providers.clone())
33 .collect();
34
35 let iter = settings
36 .git_hosting_providers
37 .clone()
38 .into_iter()
39 .chain(local_values)
40 .filter_map(|provider| {
41 let url = Url::parse(&provider.base_url).log_err()?;
42
43 Some(match provider.provider {
44 GitHostingProviderKind::Bitbucket => {
45 Arc::new(Bitbucket::new(&provider.name, url)) as _
46 }
47 GitHostingProviderKind::Github => Arc::new(Github::new(&provider.name, url)) as _,
48 GitHostingProviderKind::Gitlab => Arc::new(Gitlab::new(&provider.name, url)) as _,
49 })
50 });
51
52 provider_registry.set_setting_providers(iter);
53}
54
55#[derive(Debug, Clone)]
56pub struct GitHostingProviderSettings {
57 pub git_hosting_providers: Vec<GitHostingProviderConfig>,
58}
59
60impl Settings for GitHostingProviderSettings {
61 fn from_settings(content: &settings::SettingsContent) -> Self {
62 Self {
63 git_hosting_providers: content
64 .project
65 .git_hosting_providers
66 .clone()
67 .unwrap()
68 .into(),
69 }
70 }
71}