1use std::sync::Arc;
2
3use git::GitHostingProviderRegistry;
4use gpui::App;
5use settings::{
6 GitHostingProviderConfig, GitHostingProviderKind, RegisterSetting, Settings, SettingsStore,
7};
8use url::Url;
9use util::ResultExt as _;
10
11use crate::{Bitbucket, Forgejo, Gitea, Github, Gitlab, SourceHut};
12
13pub(crate) fn init(cx: &mut App) {
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 GitHostingProviderKind::Gitea => Arc::new(Gitea::new(&provider.name, url)) as _,
50 GitHostingProviderKind::Forgejo => Arc::new(Forgejo::new(&provider.name, url)) as _,
51 GitHostingProviderKind::SourceHut => {
52 Arc::new(SourceHut::new(&provider.name, url)) as _
53 }
54 })
55 });
56
57 provider_registry.set_setting_providers(iter);
58}
59
60#[derive(Debug, Clone, RegisterSetting)]
61pub struct GitHostingProviderSettings {
62 pub git_hosting_providers: Vec<GitHostingProviderConfig>,
63}
64
65impl Settings for GitHostingProviderSettings {
66 fn from_settings(content: &settings::SettingsContent) -> Self {
67 Self {
68 git_hosting_providers: content
69 .project
70 .git_hosting_providers
71 .clone()
72 .unwrap()
73 .into(),
74 }
75 }
76}