1
0
Fork 0
mirror of https://github.com/YunoHost/apps.git synced 2024-09-03 20:06:07 +02:00

Merge branch 'master' into master

This commit is contained in:
Marc-Flender 2024-07-28 21:00:16 +02:00 committed by GitHub
commit 6fbf3afbf3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 981 additions and 226 deletions

View file

@ -132,7 +132,7 @@ url = "https://github.com/YunoHost-Apps/alltube_ynh"
[ampache] [ampache]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "multimedia" category = "multimedia"
level = 6 level = 8
potential_alternative_to = [ "Deezer", "SoundCloud", "Spotify" ] potential_alternative_to = [ "Deezer", "SoundCloud", "Spotify" ]
state = "working" state = "working"
subtags = [ "music" ] subtags = [ "music" ]
@ -202,7 +202,7 @@ url = "https://github.com/YunoHost-Apps/backdrop_ynh"
[baikal] [baikal]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "synchronization" category = "synchronization"
level = 8 level = 6
potential_alternative_to = [ "Microsoft Outlook" ] potential_alternative_to = [ "Microsoft Outlook" ]
state = "working" state = "working"
subtags = [ "calendar", "contacts" ] subtags = [ "calendar", "contacts" ]
@ -245,7 +245,7 @@ added_date = 1674232499 # 2023/01/20
antifeatures = [ "deprecated-software" ] antifeatures = [ "deprecated-software" ]
category = "publishing" category = "publishing"
deprecated_date = 1717071136 # 2024/05/30 deprecated_date = 1717071136 # 2024/05/30
level = 7 level = 6
potential_alternative_to = [ "Blogger", "Coldfusion", "Wix" ] potential_alternative_to = [ "Blogger", "Coldfusion", "Wix" ]
state = "working" state = "working"
subtags = [ "blog" ] subtags = [ "blog" ]
@ -343,7 +343,7 @@ url = "https://github.com/YunoHost-Apps/cachet_ynh"
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "productivity_and_management" category = "productivity_and_management"
level = 0 level = 0
state = "working" state = "notworking"
subtags = [ "accounting", "business_and_ngos" ] subtags = [ "accounting", "business_and_ngos" ]
url = "https://github.com/Yunohost-Apps/caerp_ynh" url = "https://github.com/Yunohost-Apps/caerp_ynh"
@ -368,7 +368,7 @@ url = "https://github.com/YunoHost-Apps/calibreweb_ynh"
[castopod] [castopod]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "multimedia" category = "multimedia"
level = 6 level = 8
potential_alternative_to = [ "Anchor", "Apple Podcasts", "Audible", "Deezer", "SoundCloud", "Spotify" ] potential_alternative_to = [ "Anchor", "Apple Podcasts", "Audible", "Deezer", "SoundCloud", "Spotify" ]
state = "working" state = "working"
url = "https://github.com/YunoHost-Apps/castopod_ynh" url = "https://github.com/YunoHost-Apps/castopod_ynh"
@ -407,7 +407,7 @@ url = "https://github.com/YunoHost-Apps/cheky_ynh"
[chitchatter] [chitchatter]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "communication" category = "communication"
level = 8 level = 6
state = "working" state = "working"
subtags = [ "chat" ] subtags = [ "chat" ]
url = "https://github.com/YunoHost-Apps/chitchatter_ynh" url = "https://github.com/YunoHost-Apps/chitchatter_ynh"
@ -443,7 +443,7 @@ url = "https://github.com/YunoHost-Apps/chyrplite_ynh"
[cinny] [cinny]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "communication" category = "communication"
level = 8 level = 1
potential_alternative_to = [ "Discord", "Facebook Messenger", "Signal", "Skype", "Telegram", "Whatsapp" ] potential_alternative_to = [ "Discord", "Facebook Messenger", "Signal", "Skype", "Telegram", "Whatsapp" ]
state = "working" state = "working"
subtags = [ "chat" ] subtags = [ "chat" ]
@ -543,7 +543,7 @@ url = "https://github.com/YunoHost-Apps/concrete5_ynh"
[conduit] [conduit]
added_date = 1691780437 # 2023/08/11 added_date = 1691780437 # 2023/08/11
category = "communication" category = "communication"
level = 7 level = 8
potential_alternative_to = [ "Discord", "Facebook Messenger", "Signal", "Skype", "Telegram", "Whatsapp" ] potential_alternative_to = [ "Discord", "Facebook Messenger", "Signal", "Skype", "Telegram", "Whatsapp" ]
state = "working" state = "working"
subtags = [ "chat" ] subtags = [ "chat" ]
@ -570,7 +570,7 @@ url = "https://github.com/YunoHost-Apps/cops_ynh"
[coturn] [coturn]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "system_tools" category = "system_tools"
level = 6 level = 8
state = "working" state = "working"
subtags = [ "network" ] subtags = [ "network" ]
url = "https://github.com/YunoHost-Apps/coturn_ynh" url = "https://github.com/YunoHost-Apps/coturn_ynh"
@ -614,7 +614,7 @@ url = "https://github.com/YunoHost-Apps/crabfit_ynh"
[cryptpad] [cryptpad]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "office" category = "office"
level = 6 level = 8
potential_alternative_to = [ "Google Docs" ] potential_alternative_to = [ "Google Docs" ]
state = "working" state = "working"
subtags = [ "text" ] subtags = [ "text" ]
@ -689,7 +689,7 @@ url = "https://github.com/YunoHost-Apps/dendrite_ynh"
[dex] [dex]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "system_tools" category = "system_tools"
level = 6 level = 8
state = "working" state = "working"
subtags = [ "network" ] subtags = [ "network" ]
url = "https://github.com/YunoHost-Apps/dex_ynh" url = "https://github.com/YunoHost-Apps/dex_ynh"
@ -724,7 +724,7 @@ url = "https://github.com/YunoHost-Apps/diaspora_ynh"
[digiscreen] [digiscreen]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "wat" category = "wat"
level = 6 level = 7
state = "working" state = "working"
url = "https://github.com/YunoHost-Apps/digiscreen_ynh" url = "https://github.com/YunoHost-Apps/digiscreen_ynh"
@ -810,7 +810,7 @@ url = "https://github.com/YunoHost-Apps/django-for-runners_ynh"
[django-fritzconnection] [django-fritzconnection]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "system_tools" category = "system_tools"
level = 3 level = 8
state = "working" state = "working"
subtags = [ "network" ] subtags = [ "network" ]
url = "https://github.com/YunoHost-Apps/django-fritzconnection_ynh" url = "https://github.com/YunoHost-Apps/django-fritzconnection_ynh"
@ -851,7 +851,7 @@ url = "https://github.com/YunoHost-Apps/dolibarr_ynh"
[domoticz] [domoticz]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "iot" category = "iot"
level = 6 level = 8
state = "working" state = "working"
url = "https://github.com/YunoHost-Apps/domoticz_ynh" url = "https://github.com/YunoHost-Apps/domoticz_ynh"
@ -905,6 +905,13 @@ level = 8
state = "working" state = "working"
url = "https://github.com/YunoHost-Apps/duniter_ynh" url = "https://github.com/YunoHost-Apps/duniter_ynh"
[dynamicqrcode]
added_date = 1721508308 # 2024/07/20
category = "small_utilities"
level = 7
state = "working"
url = "https://github.com/YunoHost-Apps/dynamicqrcode_ynh"
[easyappointments] [easyappointments]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "productivity_and_management" category = "productivity_and_management"
@ -917,7 +924,7 @@ url = "https://github.com/YunoHost-Apps/easyappointments_ynh"
[elabftw] [elabftw]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "productivity_and_management" category = "productivity_and_management"
level = 8 level = 6
state = "working" state = "working"
url = "https://github.com/YunoHost-Apps/elabftw_ynh" url = "https://github.com/YunoHost-Apps/elabftw_ynh"
@ -1030,7 +1037,7 @@ url = "https://github.com/YunoHost-Apps/ethercalc_ynh"
[etherpad] [etherpad]
added_date = 1694300530 # 2023/09/09 added_date = 1694300530 # 2023/09/09
category = "office" category = "office"
level = 6 level = 7
potential_alternative_to = [ "G Suite", "Google Docs", "Microsoft Office", "Microsoft Word", "Office 365" ] potential_alternative_to = [ "G Suite", "Google Docs", "Microsoft Office", "Microsoft Word", "Office 365" ]
state = "working" state = "working"
subtags = [ "text" ] subtags = [ "text" ]
@ -1266,7 +1273,7 @@ url = "https://github.com/YunoHost-Apps/funkwhale_ynh"
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "communication" category = "communication"
level = 8 level = 8
potential_alternative_to = [ "Skype", "Zoom" ] potential_alternative_to = [ "BigBlueButton", "Skype", "Zoom" ]
state = "working" state = "working"
subtags = [ "meeting" ] subtags = [ "meeting" ]
url = "https://github.com/YunoHost-Apps/galene_ynh" url = "https://github.com/YunoHost-Apps/galene_ynh"
@ -1324,7 +1331,7 @@ url = "https://github.com/YunoHost-Apps/getsimple_ynh"
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
antifeatures = [ "arbitrary-limitations" ] antifeatures = [ "arbitrary-limitations" ]
category = "publishing" category = "publishing"
level = 6 level = 8
state = "working" state = "working"
subtags = [ "website" ] subtags = [ "website" ]
url = "https://github.com/YunoHost-Apps/ghost_ynh" url = "https://github.com/YunoHost-Apps/ghost_ynh"
@ -1350,7 +1357,7 @@ url = "https://github.com/YunoHost-Apps/gitlab_ynh"
[gitlab-runner] [gitlab-runner]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "dev" category = "dev"
level = 8 level = 6
state = "working" state = "working"
subtags = [ "forge" ] subtags = [ "forge" ]
url = "https://github.com/YunoHost-Apps/gitlab-runner_ynh" url = "https://github.com/YunoHost-Apps/gitlab-runner_ynh"
@ -1389,7 +1396,7 @@ url = "https://github.com/YunoHost-Apps/glowingbear_ynh"
[glpi] [glpi]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "productivity_and_management" category = "productivity_and_management"
level = 6 level = 8
potential_alternative_to = [ "Cherwell", "Freshdesk", "Ivanti", "Peregrine Systems (AssetCenter)", "Remedy (BMC Software)", "ServiceNow" ] potential_alternative_to = [ "Cherwell", "Freshdesk", "Ivanti", "Peregrine Systems (AssetCenter)", "Remedy (BMC Software)", "ServiceNow" ]
state = "working" state = "working"
subtags = [ "task" ] subtags = [ "task" ]
@ -1691,7 +1698,7 @@ url = "https://github.com/YunoHost-Apps/indexhibit_ynh"
added_date = 1691920584 # 2023/08/13 added_date = 1691920584 # 2023/08/13
branch = "main" branch = "main"
category = "system_tools" category = "system_tools"
level = 7 level = 6
state = "working" state = "working"
subtags = [ "db", "monitoring" ] subtags = [ "db", "monitoring" ]
url = "https://github.com/YunoHost-Apps/influxdb_v2_ynh" url = "https://github.com/YunoHost-Apps/influxdb_v2_ynh"
@ -1750,7 +1757,7 @@ added_date = 1674232499 # 2023/01/20
antifeatures = [ "deprecated-software", "package-not-maintained" ] antifeatures = [ "deprecated-software", "package-not-maintained" ]
category = "communication" category = "communication"
deprecated_date = 1714590228 # 2024/05/01 deprecated_date = 1714590228 # 2024/05/01
level = 7 level = 6
state = "working" state = "working"
subtags = [ "chat" ] subtags = [ "chat" ]
url = "https://github.com/YunoHost-Apps/jappix_ynh" url = "https://github.com/YunoHost-Apps/jappix_ynh"
@ -1909,7 +1916,7 @@ url = "https://github.com/YunoHost-Apps/kodi_ynh"
[koel] [koel]
added_date = 1694978602 # 2023/09/17 added_date = 1694978602 # 2023/09/17
category = "multimedia" category = "multimedia"
level = 7 level = 8
potential_alternative_to = [ "Airsonic", "Deezer", "SoundCloud", "Spotify" ] potential_alternative_to = [ "Airsonic", "Deezer", "SoundCloud", "Spotify" ]
state = "working" state = "working"
subtags = [ "music" ] subtags = [ "music" ]
@ -2208,7 +2215,7 @@ url = "https://github.com/YunoHost-Apps/mantis_ynh"
[mastodon] [mastodon]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "social_media" category = "social_media"
level = 6 level = 8
potential_alternative_to = [ "X" ] potential_alternative_to = [ "X" ]
state = "working" state = "working"
subtags = [ "microblogging" ] subtags = [ "microblogging" ]
@ -2226,7 +2233,7 @@ url = "https://github.com/YunoHost-Apps/matomo_ynh"
[matrix-appservice-irc] [matrix-appservice-irc]
added_date = 1675621561 # 2023/02/05 added_date = 1675621561 # 2023/02/05
category = "communication" category = "communication"
level = 7 level = 8
state = "working" state = "working"
subtags = [ "chat" ] subtags = [ "chat" ]
url = "https://github.com/YunoHost-Apps/matrix-appservice-irc_ynh" url = "https://github.com/YunoHost-Apps/matrix-appservice-irc_ynh"
@ -2298,7 +2305,7 @@ url = "https://github.com/YunoHost-Apps/mautrix_telegram_ynh"
[mautrix_whatsapp] [mautrix_whatsapp]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "communication" category = "communication"
level = 8 level = 6
potential_alternative_to = [ "Whatsapp" ] potential_alternative_to = [ "Whatsapp" ]
state = "working" state = "working"
subtags = [ "chat" ] subtags = [ "chat" ]
@ -2339,7 +2346,7 @@ url = "https://github.com/YunoHost-Apps/microbin_ynh"
[microblogpub] [microblogpub]
added_date = 1717921017 # 2024/06/09 added_date = 1717921017 # 2024/06/09
category = "social_media" category = "social_media"
level = 6 level = 7
state = "working" state = "working"
subtags = [ "microblogging" ] subtags = [ "microblogging" ]
url = "https://github.com/YunoHost-Apps/microblogpub_ynh" url = "https://github.com/YunoHost-Apps/microblogpub_ynh"
@ -2486,7 +2493,7 @@ url = "https://github.com/YunoHost-Apps/motioneye_ynh"
[movim] [movim]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "social_media" category = "social_media"
level = 6 level = 8
potential_alternative_to = [ "Facebook Messenger", "Facebook", "MSN" ] potential_alternative_to = [ "Facebook Messenger", "Facebook", "MSN" ]
state = "working" state = "working"
subtags = [ "microblogging" ] subtags = [ "microblogging" ]
@ -2575,7 +2582,7 @@ url = "https://github.com/YunoHost-Apps/mytinytodo_ynh"
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
antifeatures = [ "not-totally-free-upstream" ] antifeatures = [ "not-totally-free-upstream" ]
category = "iot" category = "iot"
level = 6 level = 8
state = "working" state = "working"
url = "https://github.com/YunoHost-Apps/n8n_ynh" url = "https://github.com/YunoHost-Apps/n8n_ynh"
@ -2701,7 +2708,7 @@ url = "https://github.com/YunoHost-Apps/olivetin_ynh"
[ombi] [ombi]
added_date = 1696432145 # 2023/10/04 added_date = 1696432145 # 2023/10/04
category = "multimedia" category = "multimedia"
level = 7 level = 6
potential_alternative_to = [ "Netflix", "Plex" ] potential_alternative_to = [ "Netflix", "Plex" ]
state = "working" state = "working"
subtags = [ "mediacenter" ] subtags = [ "mediacenter" ]
@ -2738,7 +2745,7 @@ added_date = 1674232499 # 2023/01/20
antifeatures = [ "deprecated-software" ] antifeatures = [ "deprecated-software" ]
category = "office" category = "office"
deprecated_date = 1708403676 # 2024/02/20 deprecated_date = 1708403676 # 2024/02/20
level = 7 level = 6
state = "working" state = "working"
subtags = [ "text" ] subtags = [ "text" ]
url = "https://github.com/YunoHost-Apps/opennote_ynh" url = "https://github.com/YunoHost-Apps/opennote_ynh"
@ -2836,7 +2843,7 @@ url = "https://github.com/YunoHost-Apps/owncast-emojiwall_ynh"
[owncloud] [owncloud]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "synchronization" category = "synchronization"
level = 7 level = 8
potential_alternative_to = [ "Apple iCloud", "Dropbox", "Google Drive", "Microsoft OneDrive" ] potential_alternative_to = [ "Apple iCloud", "Dropbox", "Google Drive", "Microsoft OneDrive" ]
state = "working" state = "working"
subtags = [ "files" ] subtags = [ "files" ]
@ -2886,7 +2893,7 @@ url = "https://github.com/YunoHost-Apps/paperless-ngx_ynh"
[peertube] [peertube]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "social_media" category = "social_media"
level = 6 level = 8
potential_alternative_to = [ "Dailymotion", "Twitch", "Vimeo", "YouTube" ] potential_alternative_to = [ "Dailymotion", "Twitch", "Vimeo", "YouTube" ]
state = "working" state = "working"
subtags = [ "videos" ] subtags = [ "videos" ]
@ -2896,7 +2903,7 @@ url = "https://github.com/YunoHost-Apps/peertube_ynh"
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
antifeatures = [ "not-totally-free-upstream" ] antifeatures = [ "not-totally-free-upstream" ]
category = "social_media" category = "social_media"
level = 7 level = 8
state = "working" state = "working"
subtags = [ "videos" ] subtags = [ "videos" ]
url = "https://github.com/YunoHost-Apps/peertube-search-index_ynh" url = "https://github.com/YunoHost-Apps/peertube-search-index_ynh"
@ -2920,7 +2927,7 @@ url = "https://github.com/YunoHost-Apps/pelican_ynh"
[penpot] [penpot]
added_date = 1708540527 # 2024/02/21 added_date = 1708540527 # 2024/02/21
category = "dev" category = "dev"
level = 6 level = 7
state = "working" state = "working"
subtags = [ "design" ] subtags = [ "design" ]
url = "https://github.com/YunoHost-Apps/penpot_ynh" url = "https://github.com/YunoHost-Apps/penpot_ynh"
@ -3212,7 +3219,7 @@ url = "https://github.com/YunoHost-Apps/prometheus_ynh"
[prosody] [prosody]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "communication" category = "communication"
level = 8 level = 0
state = "working" state = "working"
url = "https://github.com/YunoHost-Apps/prosody_ynh" url = "https://github.com/YunoHost-Apps/prosody_ynh"
@ -3702,7 +3709,7 @@ url = "https://github.com/YunoHost-Apps/snappymail_ynh"
[snipeit] [snipeit]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "productivity_and_management" category = "productivity_and_management"
level = 6 level = 8
state = "working" state = "working"
subtags = [ "business_and_ngos" ] subtags = [ "business_and_ngos" ]
url = "https://github.com/YunoHost-Apps/snipeit_ynh" url = "https://github.com/YunoHost-Apps/snipeit_ynh"
@ -3780,7 +3787,7 @@ url = "https://github.com/YunoHost-Apps/squid3_ynh"
[ssbroom] [ssbroom]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "communication" category = "communication"
level = 7 level = 8
state = "working" state = "working"
url = "https://github.com/YunoHost-Apps/ssbroom_ynh" url = "https://github.com/YunoHost-Apps/ssbroom_ynh"
@ -3886,7 +3893,7 @@ url = "https://github.com/YunoHost-Apps/syncthing_ynh"
[tandoor] [tandoor]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "small_utilities" category = "small_utilities"
level = 6 level = 8
state = "working" state = "working"
url = "https://github.com/YunoHost-Apps/tandoor_ynh" url = "https://github.com/YunoHost-Apps/tandoor_ynh"
@ -3986,7 +3993,7 @@ url = "https://github.com/YunoHost-Apps/tinyfilemanager_ynh"
[tldraw] [tldraw]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "office" category = "office"
level = 6 level = 8
potential_alternative_to = [ "Lucidchart" ] potential_alternative_to = [ "Lucidchart" ]
state = "working" state = "working"
subtags = [ "draw" ] subtags = [ "draw" ]
@ -4175,7 +4182,7 @@ url = "https://github.com/YunoHost-Apps/vikunja_ynh"
[vore] [vore]
added_date = 1690540859 # 2023/07/28 added_date = 1690540859 # 2023/07/28
category = "reading" category = "reading"
level = 7 level = 8
state = "working" state = "working"
subtags = [ "rssreader" ] subtags = [ "rssreader" ]
url = "https://github.com/YunoHost-Apps/vore_ynh" url = "https://github.com/YunoHost-Apps/vore_ynh"
@ -4511,7 +4518,7 @@ url = "https://github.com/YunoHost-Apps/zusam_ynh"
[zwave-js-ui] [zwave-js-ui]
added_date = 1674232499 # 2023/01/20 added_date = 1674232499 # 2023/01/20
category = "iot" category = "iot"
level = 6 level = 8
state = "working" state = "working"
url = "https://github.com/YunoHost-Apps/zwave-js-ui_ynh" url = "https://github.com/YunoHost-Apps/zwave-js-ui_ynh"

BIN
logos/dynamicqrcode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -1,6 +1,6 @@
Babel==2.14.0 Babel==2.14.0
blinker==1.8.1 blinker==1.8.1
certifi==2024.2.2 certifi==2024.7.4
cffi==1.16.0 cffi==1.16.0
charset-normalizer==3.3.2 charset-normalizer==3.3.2
click==8.1.7 click==8.1.7

View file

@ -8,24 +8,26 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-06-21 14:11+0200\n" "POT-Creation-Date: 2024-06-21 14:11+0200\n"
"PO-Revision-Date: 2024-02-21 06:06+0100\n" "PO-Revision-Date: 2024-07-28 12:54+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: cjdw <cjdw@users.noreply.translate.yunohost.org>\n"
"Language-Team: id <LL@li.org>\n" "Language-Team: Indonesian <https://translate.yunohost.org/projects/yunohost/"
"apps/id/>\n"
"Language: id\n" "Language: id\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Weblate 5.4.3\n"
"Generated-By: Babel 2.14.0\n" "Generated-By: Babel 2.14.0\n"
#: app.py:179 #: app.py:179
#, python-format #, python-format
msgid "App %(app_id)s not found" msgid "App %(app_id)s not found"
msgstr "" msgstr "Aplikasi %(app_id)s tidak ditemukan"
#: app.py:182 #: app.py:182
msgid "You must be logged in to be able to star an app" msgid "You must be logged in to be able to star an app"
msgstr "" msgstr "Anda harus masuk untuk dapat memberi bintang pada aplikasi"
#: app.py:184 app.py:229 app.py:634 templates/wishlist_add.html:33 #: app.py:184 app.py:229 app.py:634 templates/wishlist_add.html:33
msgid "" msgid ""
@ -35,70 +37,82 @@ msgid ""
"least 5 topics, reading at least 30 posts, and spending at least 10 minutes " "least 5 topics, reading at least 30 posts, and spending at least 10 minutes "
"reading posts." "reading posts."
msgstr "" msgstr ""
"Perhatikan bahwa, karena berbagai penyalahgunaan, kami membatasi login di "
"toko aplikasi hanya untuk pengguna 'trust level 1'.<br/><br/>'Trust level 1' "
"dapat diperoleh setelah berinteraksi minimal dengan forum, dan lebih khusus "
"lagi: memasuki minimal 5 topik, membaca minimal 30 postingan, dan "
"menghabiskan minimal 10 menit membaca postingan."
#: app.py:227 #: app.py:227
msgid "You must be logged in to submit an app to the wishlist" msgid "You must be logged in to submit an app to the wishlist"
msgstr "" msgstr "Anda harus masuk untuk mengajukan aplikasi ke dalam daftar keinginan"
#: app.py:242 #: app.py:242
msgid "Invalid CSRF token, please refresh the page and try again" msgid "Invalid CSRF token, please refresh the page and try again"
msgstr "" msgstr "Token CSRF tidak valid, silakan memuat ulang halaman dan coba lagi"
#: app.py:280 #: app.py:280
msgid "" msgid ""
"Proposing wishlist additions is limited to once every 15 days per user. " "Proposing wishlist additions is limited to once every 15 days per user. "
"Please try again in a few days." "Please try again in a few days."
msgstr "" msgstr ""
"Pengajuan penambahan daftar keinginan dibatasi setiap 15 hari sekali per "
"pengguna. Silakan mencoba lagi dalam beberapa hari."
#: app.py:284 #: app.py:284
msgid "App name should be at least 3 characters" msgid "App name should be at least 3 characters"
msgstr "" msgstr "Nama aplikasi minimal harus 3 karakter"
#: app.py:285 #: app.py:285
msgid "App name should be less than 30 characters" msgid "App name should be less than 30 characters"
msgstr "" msgstr "Nama aplikasi harus kurang dari 30 karakter"
#: app.py:288 #: app.py:288
msgid "App description should be at least 5 characters" msgid "App description should be at least 5 characters"
msgstr "" msgstr "Deskripsi aplikasi minimal harus 5 karakter"
#: app.py:292 #: app.py:292
msgid "App description should be less than 100 characters" msgid "App description should be less than 100 characters"
msgstr "" msgstr "Deskripsi aplikasi harus kurang dari 100 karakter"
#: app.py:296 #: app.py:296
msgid "Upstream code repo URL should be at least 10 characters" msgid "Upstream code repo URL should be at least 10 characters"
msgstr "" msgstr "URL depot kode hulu minimal harus 10 karakter"
#: app.py:300 #: app.py:300
msgid "Upstream code repo URL should be less than 150 characters" msgid "Upstream code repo URL should be less than 150 characters"
msgstr "" msgstr "URL depot kode hulu harus kurang dari 150 karakter"
#: app.py:304 #: app.py:304
msgid "License URL should be at least 10 characters" msgid "License URL should be at least 10 characters"
msgstr "" msgstr "URL lisensi minimal harus 10 karakter"
#: app.py:308 #: app.py:308
msgid "License URL should be less than 250 characters" msgid "License URL should be less than 250 characters"
msgstr "" msgstr "URL lisensi harus kurang dari 250 karakter"
#: app.py:310 #: app.py:310
msgid "Website URL should be less than 150 characters" msgid "Website URL should be less than 150 characters"
msgstr "" msgstr "URL situs web harus kurang dari 150 karakter"
#: app.py:313 #: app.py:313
msgid "App name contains special characters" msgid "App name contains special characters"
msgstr "" msgstr "Nama aplikasi berisi karakter khusus"
#: app.py:320 #: app.py:320
msgid "" msgid ""
"Please focus on what the app does, without using marketing, fuzzy terms, or " "Please focus on what the app does, without using marketing, fuzzy terms, or "
"repeating that the app is 'free' and 'self-hostable'." "repeating that the app is 'free' and 'self-hostable'."
msgstr "" msgstr ""
"Harap fokus pada apa yang dilakukan aplikasi, tanpa menggunakan pemasaran, "
"istilah yang tidak jelas, atau mengulangi bahwa aplikasi tersebut 'gratis' "
"dan 'dapat dihosting sendiri'."
#: app.py:330 #: app.py:330
msgid "No need to repeat the name of the app. Focus on what the app does." msgid "No need to repeat the name of the app. Focus on what the app does."
msgstr "" msgstr ""
"Tidak perlu mengulang nama aplikasinya. Fokus pada apa yang dilakukan "
"aplikasi."
#: app.py:360 #: app.py:360
#, python-format #, python-format
@ -106,6 +120,9 @@ msgid ""
"An entry with the name %(slug)s already exists in the wishlist, instead, you " "An entry with the name %(slug)s already exists in the wishlist, instead, you "
"can <a href='%(url)s'>add a star to the app to show your interest</a>." "can <a href='%(url)s'>add a star to the app to show your interest</a>."
msgstr "" msgstr ""
"Entri dengan nama %(slug)s sudah ada di dalam daftar keinginan, sebagai "
"gantinya, Anda dapat <a href='%(url)s'>menambahkan bintang pada aplikasi "
"untuk menunjukkan minat Anda</a>."
#: app.py:375 #: app.py:375
#, python-format #, python-format
@ -113,6 +130,8 @@ msgid ""
"An app with the name %(slug)s already exists in the catalog, <a " "An app with the name %(slug)s already exists in the catalog, <a "
"href='%(url)s'>you can see its page here</a>." "href='%(url)s'>you can see its page here</a>."
msgstr "" msgstr ""
"Aplikasi dengan nama %(slug)s sudah ada di dalam katalog, <a href='%(url)"
"s'>Anda dapat melihat halamannya di sini</a>."
#: app.py:400 #: app.py:400
#, python-format #, python-format
@ -121,6 +140,9 @@ msgid ""
"there's already <a href='%(url)s'>a waiting PR for this app</a>? Else, " "there's already <a href='%(url)s'>a waiting PR for this app</a>? Else, "
"please report the issue to the YunoHost team." "please report the issue to the YunoHost team."
msgstr "" msgstr ""
"Gagal membuat permintaan penarikan untuk menambahkan aplikasi ke dalam "
"daftar keinginan… Mungkin sudah ada <a href='%(url)s'>PR yang menunggu untuk "
"aplikasi ini</a>? Jika tidak, silakan melaporkan isu ini kepada tim YunoHost."
#: app.py:450 #: app.py:450
#, python-format #, python-format
@ -129,15 +151,18 @@ msgid ""
"by the YunoHost team. You can track progress here: <a href='%(url)s'>" "by the YunoHost team. You can track progress here: <a href='%(url)s'>"
"%(url)s</a>" "%(url)s</a>"
msgstr "" msgstr ""
"Aplikasi yang Anda usulkan telah berhasil dikirimkan. Seharusnya sekarang "
"sedang divalidasi oleh tim YunoHost. Anda dapat melacak kemajuannya di sini: "
"<a href='%(url)s'>%(url)s</a>"
#: app.py:632 #: app.py:632
msgid "Unfortunately, login was denied." msgid "Unfortunately, login was denied."
msgstr "" msgstr "Sayangnya, login ditolak."
#: templates/app.html:10 templates/catalog.html:23 #: templates/app.html:10 templates/catalog.html:23
#, python-format #, python-format
msgid "Logo for %(app)s" msgid "Logo for %(app)s"
msgstr "" msgstr "Logo untuk %(app)s"
#: templates/app.html:30 templates/app.html:31 templates/catalog.html:41 #: templates/app.html:30 templates/app.html:31 templates/catalog.html:41
#: templates/catalog.html:42 #: templates/catalog.html:42
@ -145,6 +170,8 @@ msgid ""
"This app is currently flagged as broken because it failed our automatic " "This app is currently flagged as broken because it failed our automatic "
"tests." "tests."
msgstr "" msgstr ""
"Aplikasi ini sekarang ditandai sebagai rusak karena gagal dalam pengujian "
"otomatis kami."
#: templates/app.html:30 templates/app.html:31 templates/catalog.html:41 #: templates/app.html:30 templates/app.html:31 templates/catalog.html:41
#: templates/catalog.html:42 templates/catalog.html:172 #: templates/catalog.html:42 templates/catalog.html:172
@ -152,6 +179,8 @@ msgid ""
"This is usually a temporary situation which requires packagers to fix " "This is usually a temporary situation which requires packagers to fix "
"something in the app." "something in the app."
msgstr "" msgstr ""
"Biasanya ini hanya situasi sementara yang mengharuskan pembuat paket "
"memperbaiki sesuatu di dalam aplikasinya."
#: templates/app.html:37 templates/app.html:38 templates/catalog.html:46 #: templates/app.html:37 templates/app.html:38 templates/catalog.html:46
#: templates/catalog.html:47 #: templates/catalog.html:47
@ -159,138 +188,143 @@ msgid ""
"This app has been good quality according to our automatic tests over at " "This app has been good quality according to our automatic tests over at "
"least one year." "least one year."
msgstr "" msgstr ""
"Aplikasi ini memiliki kualitas yang baik menurut pengujian otomatis kami "
"setidaknya selama setahun."
#: templates/app.html:81 #: templates/app.html:81
msgid "Try the demo" msgid "Try the demo"
msgstr "" msgstr "Coba demonstrasinya"
#: templates/app.html:82 #: templates/app.html:82
msgid "Demo" msgid "Demo"
msgstr "" msgstr "Demonstrasi"
#: templates/app.html:85 #: templates/app.html:85
msgid "Install with YunoHost" msgid "Install with YunoHost"
msgstr "" msgstr "Instal dengan YunoHost"
#: templates/app.html:93 #: templates/app.html:93
#, python-format #, python-format
msgid "Current version: %(version)s" msgid "Current version: %(version)s"
msgstr "" msgstr "Versi saat ini: %(version)s"
#: templates/app.html:95 #: templates/app.html:95
#, python-format #, python-format
msgid "Potential alternative to: %(alternatives)s" msgid "Potential alternative to: %(alternatives)s"
msgstr "" msgstr "Berpotensi alternatif dari: %(alternatives)s"
#: templates/app.html:101 #: templates/app.html:101
#, python-format #, python-format
msgid "Screenshot for %(app)s" msgid "Screenshot for %(app)s"
msgstr "" msgstr "Tangkapan layar pada %(app)s"
#: templates/app.html:106 #: templates/app.html:106
#, python-format #, python-format
msgid "" msgid ""
"This app is only compatible with these specific architectures: %(archs)s" "This app is only compatible with these specific architectures: %(archs)s"
msgstr "" msgstr ""
"Aplikasi ini hanya kompatibel dengan arsitektur khusus berikut ini: %(archs)s"
#: templates/app.html:112 #: templates/app.html:112
#, python-format #, python-format
msgid "This app requires an unusual amount of RAM to install: %(ram)s" msgid "This app requires an unusual amount of RAM to install: %(ram)s"
msgstr "" msgstr ""
"Aplikasi ini membutuhkan jumlah RAM yang tidak biasa agar bisa dipasang: "
"%(ram)s"
#: templates/app.html:118 #: templates/app.html:118
msgid "Important infos before installing" msgid "Important infos before installing"
msgstr "" msgstr "Informasi penting sebelum memasang"
#: templates/app.html:124 #: templates/app.html:124
msgid "Antifeatures" msgid "Antifeatures"
msgstr "" msgstr "Antifitur"
#: templates/app.html:125 #: templates/app.html:125
msgid "(This app has features you may not like)" msgid "(This app has features you may not like)"
msgstr "" msgstr "(Aplikasi ini memiliki fitur yang mungkin tidak Anda sukai)"
#: templates/app.html:136 #: templates/app.html:136
msgid "Useful links" msgid "Useful links"
msgstr "" msgstr "Tautan yang bermanfaat"
#: templates/app.html:139 #: templates/app.html:139
#, python-format #, python-format
msgid "App license: %(license)s" msgid "App license: %(license)s"
msgstr "" msgstr "Lisensi aplikasi: %(license)s"
#: templates/app.html:140 #: templates/app.html:140
msgid " Official website" msgid " Official website"
msgstr "" msgstr " Situs web resmi"
#: templates/app.html:141 #: templates/app.html:141
msgid "Official admin documentation" msgid "Official admin documentation"
msgstr "" msgstr "Dokumentasi admin resmi"
#: templates/app.html:142 #: templates/app.html:142
msgid "Official user documentation" msgid "Official user documentation"
msgstr "" msgstr "Dokumentasi Pengguna Resmi"
#: templates/app.html:143 #: templates/app.html:143
msgid "Official code repository" msgid "Official code repository"
msgstr "" msgstr "Depot kode resmi"
#: templates/app.html:144 #: templates/app.html:144
msgid "YunoHost package repository" msgid "YunoHost package repository"
msgstr "" msgstr "Depot paket YunoHost"
#: templates/app.html:145 #: templates/app.html:145
msgid "YunoHost package license" msgid "YunoHost package license"
msgstr "" msgstr "Lisensi paket YunoHost"
#: templates/base.html:11 #: templates/base.html:11
msgid "YunoHost app store" msgid "YunoHost app store"
msgstr "" msgstr "Toko aplikasi Yunohost"
#: templates/base.html:31 templates/base.html:163 templates/index.html:3 #: templates/base.html:31 templates/base.html:163 templates/index.html:3
msgid "Home" msgid "Home"
msgstr "" msgstr "Rumah"
#: templates/base.html:40 templates/base.html:172 templates/dash.html:83 #: templates/base.html:40 templates/base.html:172 templates/dash.html:83
msgid "Catalog" msgid "Catalog"
msgstr "" msgstr "Katalog"
#: templates/base.html:46 templates/base.html:181 #: templates/base.html:46 templates/base.html:181
msgid "Wishlist" msgid "Wishlist"
msgstr "" msgstr "Daftar Keinginan"
#: templates/base.html:52 #: templates/base.html:52
msgid "Packaging dashboard" msgid "Packaging dashboard"
msgstr "" msgstr "Dasbor paket"
#: templates/base.html:57 #: templates/base.html:57
msgid "Charts & history" msgid "Charts & history"
msgstr "" msgstr "Grafik & rIwayat"
#: templates/base.html:71 templates/base.html:191 #: templates/base.html:71 templates/base.html:191
msgid "YunoHost documentation" msgid "YunoHost documentation"
msgstr "" msgstr "Dokumentasi YunoHost"
#: templates/base.html:79 templates/base.html:80 #: templates/base.html:79 templates/base.html:80
msgid "Toggle light/dark mode" msgid "Toggle light/dark mode"
msgstr "" msgstr "Beralih ke mode terang/gelap"
#: templates/base.html:88 templates/base.html:201 #: templates/base.html:88 templates/base.html:201
msgid "Login using YunoHost's forum" msgid "Login using YunoHost's forum"
msgstr "" msgstr "Masuk melalui forum YunoHost"
#: templates/base.html:120 templates/base.html:129 templates/base.html:229 #: templates/base.html:120 templates/base.html:129 templates/base.html:229
#: templates/base.html:238 #: templates/base.html:238
msgid "Packaging boards" msgid "Packaging boards"
msgstr "" msgstr "Papan pengemasan"
#: templates/base.html:136 templates/base.html:246 #: templates/base.html:136 templates/base.html:246
msgid "Logout" msgid "Logout"
msgstr "" msgstr "Keluar"
#: templates/base.html:149 #: templates/base.html:149
msgid "Toggle menu" msgid "Toggle menu"
msgstr "" msgstr "Beralih menu"
#: templates/base.html:264 #: templates/base.html:264
msgid "" msgid ""
@ -299,176 +333,183 @@ msgid ""
"palletsprojects.com'>Flask</a> and <a class='text-blue-800 dark:text-" "palletsprojects.com'>Flask</a> and <a class='text-blue-800 dark:text-"
"blue-400' href='https://tailwindcss.com/'>TailwindCSS</a>" "blue-400' href='https://tailwindcss.com/'>TailwindCSS</a>"
msgstr "" msgstr ""
"Dibuat dengan <i class='text-red-500 fa fa-heart-o' aria-label='love'></i> "
"menggunakan <a class='text-blue-800 dark:text-blue-400' href='https://flask."
"palletsprojects.com'>Flask</a> dan <a class='text-blue-800 dark:text-blue-"
"400' href='https://tailwindcss.com/'>TailwindCSS</a>"
#: templates/base.html:265 #: templates/base.html:265
msgid "Source" msgid "Source"
msgstr "" msgstr "Sumber"
#: templates/base.html:266 #: templates/base.html:266
msgid "Terms of Services" msgid "Terms of Services"
msgstr "" msgstr "Ketentuan Layanan"
#: templates/catalog.html:77 templates/catalog.html:82 #: templates/catalog.html:77 templates/catalog.html:82
msgid "Application Catalog" msgid "Application Catalog"
msgstr "" msgstr "Katalog Aplikasi"
#: templates/catalog.html:88 templates/wishlist.html:16 #: templates/catalog.html:88 templates/wishlist.html:16
msgid "Search" msgid "Search"
msgstr "" msgstr "Cari"
#: templates/catalog.html:93 templates/wishlist.html:21 #: templates/catalog.html:93 templates/wishlist.html:21
msgid "Search for…" msgid "Search for…"
msgstr "" msgstr "Mencari…"
#: templates/catalog.html:109 #: templates/catalog.html:109
msgid "All apps" msgid "All apps"
msgstr "" msgstr "Semua aplikasi"
#: templates/catalog.html:119 templates/dash.html:36 templates/wishlist.html:39 #: templates/catalog.html:119 templates/dash.html:36 templates/wishlist.html:39
msgid "Sort by" msgid "Sort by"
msgstr "" msgstr "Sortir dengan"
#: templates/catalog.html:125 templates/wishlist.html:45 #: templates/catalog.html:125 templates/wishlist.html:45
#: templates/wishlist.html:78 #: templates/wishlist.html:78
msgid "Popularity" msgid "Popularity"
msgstr "" msgstr "Popularitas"
#: templates/catalog.html:126 #: templates/catalog.html:126
msgid "Newest" msgid "Newest"
msgstr "" msgstr "Terbaru"
#: templates/catalog.html:127 templates/dash.html:42 templates/wishlist.html:46 #: templates/catalog.html:127 templates/dash.html:42 templates/wishlist.html:46
msgid "Alphabetical" msgid "Alphabetical"
msgstr "" msgstr "Alfabetis"
#: templates/catalog.html:130 templates/dash.html:64 templates/wishlist.html:49 #: templates/catalog.html:130 templates/dash.html:64 templates/wishlist.html:49
msgid "Requires to be logged-in" msgid "Requires to be logged-in"
msgstr "" msgstr "Harus masuk terlebih dahulu"
#: templates/catalog.html:132 templates/catalog.html:141 templates/dash.html:66 #: templates/catalog.html:132 templates/catalog.html:141 templates/dash.html:66
#: templates/dash.html:75 templates/wishlist.html:51 templates/wishlist.html:60 #: templates/dash.html:75 templates/wishlist.html:51 templates/wishlist.html:60
msgid "Show only apps you starred" msgid "Show only apps you starred"
msgstr "" msgstr "Hanya menampilkan aplikasi yang Anda bintangi"
#: templates/catalog.html:157 templates/wishlist.html:154 #: templates/catalog.html:157 templates/wishlist.html:154
msgid "No results found." msgid "No results found."
msgstr "" msgstr "Tidak ada hasil yang ditemukan."
#: templates/catalog.html:160 #: templates/catalog.html:160
msgid "Not finding what you are looking for?" msgid "Not finding what you are looking for?"
msgstr "" msgstr "Tidak menemukan apa yang Anda cari?"
#: templates/catalog.html:161 #: templates/catalog.html:161
msgid "Checkout the wishlist!" msgid "Checkout the wishlist!"
msgstr "" msgstr "Lihatlah daftar keinginan!"
#: templates/catalog.html:168 #: templates/catalog.html:168
msgid "Applications currently flagged as broken" msgid "Applications currently flagged as broken"
msgstr "" msgstr "Saat ini aplikasi ditandai sebagai rusak"
#: templates/catalog.html:171 #: templates/catalog.html:171
msgid "These are apps which failed our automatic tests." msgid "These are apps which failed our automatic tests."
msgstr "" msgstr "Ini adalah aplikasi yang gagal dalam pengujian otomatis kami."
#: templates/catalog.html:186 #: templates/catalog.html:186
msgid "Deprecated applications" msgid "Deprecated applications"
msgstr "" msgstr "Aplikasi yang kedaluwarsa"
#: templates/catalog.html:189 #: templates/catalog.html:189
msgid "These are apps who are not maintained anymore." msgid "These are apps who are not maintained anymore."
msgstr "" msgstr "Ini adalah aplikasi yang tidak terawat."
#: templates/catalog.html:190 #: templates/catalog.html:190
msgid "" msgid ""
"This means that the developer will no longer update them. We strongly advise " "This means that the developer will no longer update them. We strongly advise "
"against their installation and advise users to find alternatives." "against their installation and advise users to find alternatives."
msgstr "" msgstr ""
"Artinya pengembang tidak akan memperbaruinya lagi. Kami sangat menyarankan "
"agar tidak memasangnya dan menyarankan pengguna untuk mencari alternatif "
"lain."
#: templates/charts.html:5 #: templates/charts.html:5
msgid "Apps quality level from automatic tests" msgid "Apps quality level from automatic tests"
msgstr "" msgstr "Tingkat kualitas aplikasi dari pengujian otomatis"
#: templates/charts.html:9 #: templates/charts.html:9
msgid "Apps quality level history" msgid "Apps quality level history"
msgstr "" msgstr "Riwayat tingkat kualitas aplikasi"
#: templates/charts.html:15 #: templates/charts.html:15
msgid "History" msgid "History"
msgstr "" msgstr "Riwayat"
#: templates/charts.html:27 #: templates/charts.html:27
msgid "Added" msgid "Added"
msgstr "" msgstr "Ditambahkan"
#: templates/charts.html:33 #: templates/charts.html:33
msgid "Repaired" msgid "Repaired"
msgstr "" msgstr "Diperbaiki"
#: templates/charts.html:39 #: templates/charts.html:39
msgid "Broke" msgid "Broke"
msgstr "" msgstr "Rusak"
#: templates/charts.html:45 #: templates/charts.html:45
msgid "Removed" msgid "Removed"
msgstr "" msgstr "Disingkirkan"
#: templates/charts.html:93 #: templates/charts.html:93
msgid "Unknown" msgid "Unknown"
msgstr "" msgstr "Tidak diketahui"
#: templates/charts.html:94 #: templates/charts.html:94
msgid "Level 0" msgid "Level 0"
msgstr "" msgstr "Tingkat 0"
#: templates/charts.html:95 #: templates/charts.html:95
msgid "Level 1" msgid "Level 1"
msgstr "" msgstr "Tingkat 1"
#: templates/charts.html:96 #: templates/charts.html:96
msgid "Level 2" msgid "Level 2"
msgstr "" msgstr "Tingkat 2"
#: templates/charts.html:97 #: templates/charts.html:97
msgid "Level 3" msgid "Level 3"
msgstr "" msgstr "Tingkat 3"
#: templates/charts.html:98 #: templates/charts.html:98
msgid "Level 4" msgid "Level 4"
msgstr "" msgstr "Tingkat 4"
#: templates/charts.html:99 #: templates/charts.html:99
msgid "Level 5" msgid "Level 5"
msgstr "" msgstr "Tingkat 5"
#: templates/charts.html:100 #: templates/charts.html:100
msgid "Level 6" msgid "Level 6"
msgstr "" msgstr "Tingkat 6"
#: templates/charts.html:101 #: templates/charts.html:101
msgid "Level 7" msgid "Level 7"
msgstr "" msgstr "Tingkat 7"
#: templates/charts.html:102 #: templates/charts.html:102
msgid "Level 8" msgid "Level 8"
msgstr "" msgstr "Tingkat 8"
#: templates/charts.html:122 #: templates/charts.html:122
#, python-format #, python-format
msgid "Level %(level)s:" msgid "Level %(level)s:"
msgstr "" msgstr "Tingkat %(level)s:"
#: templates/charts.html:122 #: templates/charts.html:122
msgid "Total:" msgid "Total:"
msgstr "" msgstr "Jumlah:"
#: templates/charts.html:123 #: templates/charts.html:123
#, python-format #, python-format
msgid "Level %(level)s" msgid "Level %(level)s"
msgstr "" msgstr "Tingkat %(level)s"
#: templates/dash.html:3 templates/dash.html:9 #: templates/dash.html:3 templates/dash.html:9
msgid "App packaging dashboard" msgid "App packaging dashboard"
msgstr "" msgstr "Dasbor pengemasan aplikasi"
#: templates/dash.html:11 #: templates/dash.html:11
msgid "" msgid ""
@ -479,171 +520,184 @@ msgid ""
"documentation</a> and come say hi to us on the <a class='text-blue-500' " "documentation</a> and come say hi to us on the <a class='text-blue-500' "
"href='https://yunohost.org/chat_rooms'>app packaging chatroom</a>!" "href='https://yunohost.org/chat_rooms'>app packaging chatroom</a>!"
msgstr "" msgstr ""
"Di sini adalah tempat para pengemas dapat memantau status pengujian otomatis "
"(CI) dan permintaan penarikan umum yang sedang berlangsung di semua "
"aplikasi. Jika Anda ingin memulai pengemasan aplikasi di YunoHost, silakan "
"periksa <a class='text-blue-500' href='https://yunohost.org/"
"packaging_apps'>dokumentasi pengemasan</a> dan sapa kami di <a class='text-"
"blue-500' href='https://yunohost.org/chat_rooms'>ruang obrolan pengemasan "
"aplikasi</a>!"
#: templates/dash.html:18 #: templates/dash.html:18
msgid "Filter" msgid "Filter"
msgstr "" msgstr "Filter"
#: templates/dash.html:24 #: templates/dash.html:24
msgid "(None)" msgid "(None)"
msgstr "" msgstr "(Kosong)"
#: templates/dash.html:25 #: templates/dash.html:25
msgid "Regressions on main CI" msgid "Regressions on main CI"
msgstr "" msgstr "Regresi pada CI utama"
#: templates/dash.html:26 #: templates/dash.html:26
msgid "Broken / low quality apps" msgid "Broken / low quality apps"
msgstr "" msgstr "Aplikasi rusak / kualitas rendah"
#: templates/dash.html:27 #: templates/dash.html:27
msgid "Outdated tests on main CI" msgid "Outdated tests on main CI"
msgstr "" msgstr "Tes pada CI utama kedaluwarsa"
#: templates/dash.html:28 #: templates/dash.html:28
msgid "Major regressions on Bookworm CI" msgid "Major regressions on Bookworm CI"
msgstr "" msgstr "Regresi besar pada CI Bookworm"
#: templates/dash.html:29 #: templates/dash.html:29
msgid "Apps with testings PRs" msgid "Apps with testings PRs"
msgstr "" msgstr "Aplikasi dengan pengujian pada PR"
#: templates/dash.html:30 #: templates/dash.html:30
msgid "Apps with autoupdate PRs" msgid "Apps with autoupdate PRs"
msgstr "" msgstr "Aplikasi dengan pembaruan otomatis pada PR"
#: templates/dash.html:31 #: templates/dash.html:31
msgid "Apps with issues" msgid "Apps with issues"
msgstr "" msgstr "Aplikasi disertai dengan isu"
#: templates/dash.html:32 #: templates/dash.html:32
msgid "Packaging v1 apps" msgid "Packaging v1 apps"
msgstr "" msgstr "Mengemas aplikasi v1"
#: templates/dash.html:43 #: templates/dash.html:43
msgid "Quality level" msgid "Quality level"
msgstr "" msgstr "Tingkat kualitas"
#: templates/dash.html:44 templates/dash.html:214 #: templates/dash.html:44 templates/dash.html:214
msgid "Popularity stars" msgid "Popularity stars"
msgstr "" msgstr "Bintang popularitas"
#: templates/dash.html:45 #: templates/dash.html:45
msgid "Last update on main/master branch" msgid "Last update on main/master branch"
msgstr "" msgstr "Pembaruan terakhir pada cabang main/master"
#: templates/dash.html:46 #: templates/dash.html:46
msgid "Last update on testing branch" msgid "Last update on testing branch"
msgstr "" msgstr "Pembaruan terakhir pada cabang testing"
#: templates/dash.html:47 #: templates/dash.html:47
msgid "Issues number" msgid "Issues number"
msgstr "" msgstr "nomor isu"
#: templates/dash.html:53 templates/dash.html:62 #: templates/dash.html:53 templates/dash.html:62
msgid "Hide deprecated/unmaintained apps" msgid "Hide deprecated/unmaintained apps"
msgstr "" msgstr "Sembunyikan aplikasi kedaluwarsa/tidak dirawat"
#: templates/dash.html:82 #: templates/dash.html:82
msgid "App" msgid "App"
msgstr "" msgstr "Aplikasi"
#: templates/dash.html:84 #: templates/dash.html:84
msgid "Main CI" msgid "Main CI"
msgstr "" msgstr "CI utama"
#: templates/dash.html:85 #: templates/dash.html:85
msgid "Bookworm CI" msgid "Bookworm CI"
msgstr "" msgstr "CI bookworm"
#: templates/dash.html:86 #: templates/dash.html:86
msgid "Testing PR" msgid "Testing PR"
msgstr "" msgstr "PR testing"
#: templates/dash.html:87 #: templates/dash.html:87
msgid "Autoupdate PR" msgid "Autoupdate PR"
msgstr "" msgstr "PR autoupdate"
#: templates/dash.html:88 #: templates/dash.html:88
msgid "Issues" msgid "Issues"
msgstr "" msgstr "Isu"
#: templates/dash.html:128 templates/dash.html:146 templates/dash.html:165 #: templates/dash.html:128 templates/dash.html:146 templates/dash.html:165
msgid "Broken" msgid "Broken"
msgstr "" msgstr "Rusak"
#: templates/dash.html:130 templates/dash.html:148 templates/dash.html:167 #: templates/dash.html:130 templates/dash.html:148 templates/dash.html:167
msgid "Low quality" msgid "Low quality"
msgstr "" msgstr "Kualitas rendah"
#: templates/dash.html:142 templates/dash.html:161 #: templates/dash.html:142 templates/dash.html:161
#, python-format #, python-format
msgid "Outdated test (%(days)s days ago)" msgid "Outdated test (%(days)s days ago)"
msgstr "" msgstr "Tes kedaluwarsa (%(days)s hari lalu)"
#: templates/dash.html:184 templates/dash.html:199 #: templates/dash.html:184 templates/dash.html:199
#, python-format #, python-format
msgid "Inactive (%(days)s days ago)" msgid "Inactive (%(days)s days ago)"
msgstr "" msgstr "Tidak aktif (%(days)s hari lalu)"
#: templates/dash.html:218 #: templates/dash.html:218
msgid "Packaging v1" msgid "Packaging v1"
msgstr "" msgstr "Kemasan v1"
#: templates/dash.html:221 #: templates/dash.html:221
msgid "Deprecated" msgid "Deprecated"
msgstr "" msgstr "Kedaluwarsa"
#: templates/dash.html:224 #: templates/dash.html:224
msgid "Not maintained" msgid "Not maintained"
msgstr "" msgstr "Tidak dirawat"
#: templates/dash.html:238 #: templates/dash.html:238
#, python-format #, python-format
msgid "Last data update %(time)s ago" msgid "Last data update %(time)s ago"
msgstr "" msgstr "Pembaruan data terakhir %(time)s yang lalu"
#: templates/index.html:10 #: templates/index.html:10
msgid "Application Store" msgid "Application Store"
msgstr "" msgstr "Toko Aplikasi"
#: templates/index.html:21 #: templates/index.html:21
msgid "Browse all applications" msgid "Browse all applications"
msgstr "" msgstr "Telusuri semua aplikasi"
#: templates/wishlist.html:33 templates/wishlist_add.html:3 #: templates/wishlist.html:33 templates/wishlist_add.html:3
msgid "Suggest an app" msgid "Suggest an app"
msgstr "" msgstr "Sarankan sebuah aplikasi"
#: templates/wishlist_add.html:8 #: templates/wishlist_add.html:8
msgid "Suggest an application to be added to YunoHost's catalog" msgid "Suggest an application to be added to YunoHost's catalog"
msgstr "" msgstr "Sarankan sebuah aplikasi agar ditambahkan ke katalog YunoHost"
#: templates/wishlist_add.html:29 #: templates/wishlist_add.html:29
msgid "You must first login to be allowed to submit an app to the wishlist" msgid "You must first login to be allowed to submit an app to the wishlist"
msgstr "" msgstr ""
"pertama-tama Anda harus masuk terlebih dahulu agar dapat mengajukan aplikasi "
"ke dalam daftar keinginan"
#: templates/wishlist_add.html:40 #: templates/wishlist_add.html:40
msgid "Due to abuses, only one proposal every 15 days per user is allowed." msgid "Due to abuses, only one proposal every 15 days per user is allowed."
msgstr "" msgstr ""
"Karena penyalahgunaan, hanya satu proposal setiap 15 hari per pengguna yang "
"diizinkan."
#: templates/wishlist_add.html:43 #: templates/wishlist_add.html:43
msgid "" msgid ""
"Reviewing those proposals is tiring for volunteers, please don't yolo-send " "Reviewing those proposals is tiring for volunteers, please don't yolo-send "
"every random nerdy stuff you find on the Internet." "every random nerdy stuff you find on the Internet."
msgstr "" msgstr ""
"Meninjau proposal tersebut melelahkan bagi para sukarelawan, mohon jangan "
"mengirimkan hal-hal aneh yang Anda temukan di Internet secara acak."
#: templates/wishlist.html:71 templates/wishlist_add.html:61 #: templates/wishlist.html:71 templates/wishlist_add.html:61
msgid "Name" msgid "Name"
msgstr "" msgstr "Nama"
#: templates/wishlist_add.html:64 #: templates/wishlist_add.html:64
msgid "App's description" msgid "App's description"
msgstr "" msgstr "Deskripsi aplikasi"
#: templates/wishlist_add.html:66 #: templates/wishlist_add.html:66
msgid "Please be concise and focus on what the app does." msgid "Please be concise and focus on what the app does."
msgstr "" msgstr "Harap lebih singkat dan fokus pada fungsi aplikasi."
#: templates/wishlist_add.html:66 #: templates/wishlist_add.html:66
msgid "" msgid ""
@ -652,38 +706,48 @@ msgid ""
"marketing stuff like 'the most', or vague properties like 'easy', 'simple', " "marketing stuff like 'the most', or vague properties like 'easy', 'simple', "
"'lightweight'." "'lightweight'."
msgstr "" msgstr ""
"Tidak perlu mengulangi kata-kata '[Aplikasi] adalah …'. Tidak perlu "
"menyatakan bahwa aplikasi tersebut gratis/sumber-terbuka atau di-hosting "
"sendiri (jika tidak, aplikasi itu tidak akan dikemas di YunoHost). Hindari "
"promosi seperti 'paling', atau properti yang tidak jelas seperti 'mudah', "
"'sederhana', 'ringan'."
#: templates/wishlist_add.html:68 #: templates/wishlist_add.html:68
msgid "Project code repository" msgid "Project code repository"
msgstr "" msgstr "Depot kode proyek"
#: templates/wishlist_add.html:71 #: templates/wishlist_add.html:71
msgid "Link to the project's LICENSE" msgid "Link to the project's LICENSE"
msgstr "" msgstr "Tautan ke LICENSE proyek"
#: templates/wishlist_add.html:73 #: templates/wishlist_add.html:73
msgid "" msgid ""
"The YunoHost project will only package free/open-source software (with " "The YunoHost project will only package free/open-source software (with "
"possible case-by-case exceptions for apps which are not-totally-free)" "possible case-by-case exceptions for apps which are not-totally-free)"
msgstr "" msgstr ""
"Proyek YunoHost hanya akan mengemas perangkat lunak gratis/sumber-terbuka ("
"dengan kemungkinan pengecualian kasus per kasus pada aplikasi yang tidak "
"sepenuhnya gratis)"
#: templates/wishlist_add.html:75 #: templates/wishlist_add.html:75
msgid "Project website" msgid "Project website"
msgstr "" msgstr "Website proyek"
#: templates/wishlist_add.html:77 #: templates/wishlist_add.html:77
msgid "" msgid ""
"Please *do not* just copy-paste the code repository URL. If the project has " "Please *do not* just copy-paste the code repository URL. If the project has "
"no proper website, then leave the field empty." "no proper website, then leave the field empty."
msgstr "" msgstr ""
"Harap *jangan* hanya menyalin-tempel URL depot kode. Jika proyek tidak "
"memiliki situs web yang tepat, biarkan kolom tersebut kosong."
#: templates/wishlist_add.html:84 #: templates/wishlist_add.html:84
msgid "Submit" msgid "Submit"
msgstr "" msgstr "Kirim"
#: templates/wishlist.html:3 templates/wishlist.html:8 #: templates/wishlist.html:3 templates/wishlist.html:8
msgid "Application Wishlist" msgid "Application Wishlist"
msgstr "" msgstr "Daftar Keinginan Aplikasi"
#: templates/wishlist.html:10 #: templates/wishlist.html:10
msgid "" msgid ""
@ -694,19 +758,25 @@ msgid ""
"to integrate it, and is merely a source of inspiration for packaging " "to integrate it, and is merely a source of inspiration for packaging "
"volunteers." "volunteers."
msgstr "" msgstr ""
"Daftar keinginan adalah tempat orang-orang dapat secara kolektif menyarankan "
"dan memilih agar aplikasi-aplikasi tersebut dikemas dan disediakan dalam "
"katalog aplikasi resmi YunoHost. Namun, fakta bahwa aplikasi yang tercantum "
"di sini tidak dapat diartikan sebagai fakta bahwa proyek YunoHost berencana "
"untuk mengintegrasikannya, dan hanya menjadi sumber inspirasi bagi para "
"relawan pengemasan."
#: templates/wishlist.html:74 #: templates/wishlist.html:74
msgid "Description" msgid "Description"
msgstr "" msgstr "Deskripsi"
#: templates/wishlist.html:102 templates/wishlist.html:103 #: templates/wishlist.html:102 templates/wishlist.html:103
msgid "Official website" msgid "Official website"
msgstr "" msgstr "Website resmi"
#: templates/wishlist.html:115 templates/wishlist.html:116 #: templates/wishlist.html:115 templates/wishlist.html:116
msgid "Code repository" msgid "Code repository"
msgstr "" msgstr "Depot kode"
#: templates/wishlist.html:129 templates/wishlist.html:130 #: templates/wishlist.html:129 templates/wishlist.html:130
msgid "Star this app" msgid "Star this app"
msgstr "" msgstr "Bintangi aplikasi ini"

View file

@ -241,9 +241,10 @@ class AppAutoUpdater:
if source == "main": if source == "main":
main_version = version main_version = version
branch_name = f"ci-auto-update-{version}" branch_name = f"ci-auto-update-{version}"
pr_title = commit_msg = f"Upgrade to v{version}" pr_title = f"Upgrade to v{version}"
if msg: if msg:
commit_msg += f"\n{msg}" commit_msg += f"\n- `{source}` v{version}: {msg}"
self.repo.manifest_raw = self.replace_version_and_asset_in_manifest( self.repo.manifest_raw = self.replace_version_and_asset_in_manifest(
self.repo.manifest_raw, self.repo.manifest_raw,
@ -256,6 +257,11 @@ class AppAutoUpdater:
if state == State.up_to_date: if state == State.up_to_date:
return (State.up_to_date, "", "", "") return (State.up_to_date, "", "", "")
if main_version == "":
self.repo.manifest_raw = self.bump_version(
self.repo.manifest_raw, self.current_version, bump_ynh_level=True
)
if edit: if edit:
self.repo.edit_manifest(self.repo.manifest_raw) self.repo.edit_manifest(self.repo.manifest_raw)
@ -385,7 +391,7 @@ class AppAutoUpdater:
f"Unknown update strategy '{strategy}' for '{name}', expected one of {STRATEGIES}" f"Unknown update strategy '{strategy}' for '{name}', expected one of {STRATEGIES}"
) )
result = self.get_latest_version_and_asset(strategy, asset, autoupdate) result = self.get_latest_version_and_asset(strategy, asset, infos)
if result is None: if result is None:
return None return None
new_version, assets, more_info = result new_version, assets, more_info = result
@ -452,8 +458,9 @@ class AppAutoUpdater:
return next(iter(matching_assets.items())) return next(iter(matching_assets.items()))
def get_latest_version_and_asset( def get_latest_version_and_asset(
self, strategy: str, asset: Union[str, dict], autoupdate self, strategy: str, asset: Union[str, dict], infos: dict[str, Any]
) -> Optional[tuple[str, Union[str, dict[str, str]], str]]: ) -> Optional[tuple[str, Union[str, dict[str, str]], str]]:
autoupdate = infos.get("autoupdate")
upstream = autoupdate.get("upstream", self.main_upstream).strip("/") upstream = autoupdate.get("upstream", self.main_upstream).strip("/")
version_re = autoupdate.get("version_regex", None) version_re = autoupdate.get("version_regex", None)
allow_prereleases = autoupdate.get("allow_prereleases", False) allow_prereleases = autoupdate.get("allow_prereleases", False)
@ -496,6 +503,11 @@ class AppAutoUpdater:
latest_assets = latest_release["tarball_url"] latest_assets = latest_release["tarball_url"]
# get the release changelog link # get the release changelog link
latest_release_html_url = latest_release["html_url"] latest_release_html_url = latest_release["html_url"]
if latest_release_html_url is None or latest_release_html_url == "":
latest_release_html_url = api.changelog_for_ref(
latest_version_orig, "", RefType.releases
)
if asset == "tarball": if asset == "tarball":
latest_tarball = api.url_for_ref(latest_version_orig, RefType.tags) latest_tarball = api.url_for_ref(latest_version_orig, RefType.tags)
return latest_version, latest_tarball, latest_release_html_url return latest_version, latest_tarball, latest_release_html_url
@ -533,7 +545,11 @@ class AppAutoUpdater:
tags, self.app_id, version_re tags, self.app_id, version_re
) )
latest_tarball = api.url_for_ref(latest_version_orig, RefType.tags) latest_tarball = api.url_for_ref(latest_version_orig, RefType.tags)
return latest_version, latest_tarball, "" return (
latest_version,
latest_tarball,
api.changelog_for_ref(latest_version, "", RefType.tags),
)
if revision_type == "commit": if revision_type == "commit":
if self.latest_commit_weekly and datetime.now().weekday() != 0: if self.latest_commit_weekly and datetime.now().weekday() != 0:
@ -552,7 +568,23 @@ class AppAutoUpdater:
) )
version_format = autoupdate.get("force_version", "%Y.%m.%d") version_format = autoupdate.get("force_version", "%Y.%m.%d")
latest_version = latest_commit_date.strftime(version_format) latest_version = latest_commit_date.strftime(version_format)
return latest_version, latest_tarball, "" return (
latest_version,
latest_tarball,
api.changelog_for_ref(
latest_commit["sha"], self.get_old_ref(infos), RefType.commits
),
)
return None
@staticmethod
def get_old_ref(infos: dict[str, Any]) -> str:
regex = r".*[\/-]([a-f0-9]+)\."
if isinstance(infos["url"], str):
return re.match(regex, infos["url"]).group(1)
if isinstance(infos["url"], dict):
for _, url in infos["url"]:
return re.match(regex, url).group(1)
return None return None
def replace_version_and_asset_in_manifest( def replace_version_and_asset_in_manifest(
@ -580,19 +612,34 @@ class AppAutoUpdater:
] ]
if is_main: if is_main:
content = self.bump_version(content, new_version)
def repl(m: re.Match) -> str:
return m.group(1) + new_version + '~ynh1"'
content = re.sub(
r"(\s*version\s*=\s*[\"\'])([^~\"\']+)(\~ynh\d+[\"\'])", repl, content
)
for old, new in replacements: for old, new in replacements:
content = content.replace(old, new) content = content.replace(old, new)
return content return content
def bump_version(
self, content: str, new_version: str, bump_ynh_level: bool = False
) -> str:
ynh_level = 1
if bump_ynh_level:
ynh_level = (
int(
re.search(
r"\s*version\s*=\s*[\"\'][^~\"\']+~ynh(\d+)[\"\']", content
).group(1)
)
+ 1
)
def repl(m: re.Match) -> str:
return m.group(1) + new_version + f'~ynh{ynh_level}"'
return re.sub(
r"(\s*version\s*=\s*[\"\'])([^~\"\']+)(~ynh\d+[\"\'])", repl, content
)
def paste_on_haste(data): def paste_on_haste(data):
# NB: we hardcode this here and can't use the yunopaste command # NB: we hardcode this here and can't use the yunopaste command

View file

@ -2,4 +2,3 @@ requests
PyGithub PyGithub
toml toml
tqdm tqdm
GitPython

View file

@ -10,6 +10,7 @@ import requests
class RefType(Enum): class RefType(Enum):
tags = 1 tags = 1
commits = 2 commits = 2
releases = 3
class GithubAPI: class GithubAPI:
@ -41,13 +42,20 @@ class GithubAPI:
def url_for_ref(self, ref: str, ref_type: RefType) -> str: def url_for_ref(self, ref: str, ref_type: RefType) -> str:
"""Get a URL for a ref.""" """Get a URL for a ref."""
if ref_type == RefType.tags: if ref_type == RefType.tags or ref_type == RefType.releases:
return f"{self.upstream}/archive/refs/tags/{ref}.tar.gz" return f"{self.upstream}/archive/refs/tags/{ref}.tar.gz"
elif ref_type == RefType.commits: elif ref_type == RefType.commits:
return f"{self.upstream}/archive/{ref}.tar.gz" return f"{self.upstream}/archive/{ref}.tar.gz"
else: else:
raise NotImplementedError raise NotImplementedError
def changelog_for_ref(self, new_ref: str, old_ref: str, ref_type: RefType) -> str:
"""Get a changelog for a ref."""
if ref_type == RefType.commits:
return f"{self.upstream}/compare/{old_ref}...{new_ref}"
else:
return f"{self.upstream}/releases/tag/{new_ref}"
class GitlabAPI: class GitlabAPI:
def __init__(self, upstream: str): def __init__(self, upstream: str):
@ -135,11 +143,24 @@ class GitlabAPI:
return retval return retval
def url_for_ref(self, ref: str, ref_type: RefType) -> str: def url_for_ref(self, ref: str, _: RefType) -> str:
name = self.project_path.split("/")[-1] name = self.project_path.split("/")[-1]
clean_ref = ref.replace("/", "-") clean_ref = ref.replace("/", "-")
return f"{self.forge_root}/{self.project_path}/-/archive/{ref}/{name}-{clean_ref}.tar.bz2" return f"{self.forge_root}/{self.project_path}/-/archive/{ref}/{name}-{clean_ref}.tar.bz2"
def changelog_for_ref(self, new_ref: str, old_ref: str, ref_type: RefType) -> str:
"""Get a changelog for a ref."""
if ref_type == RefType.commits:
return (
f"{self.forge_root}/{self.project_path}/-/compare/{old_ref}...{new_ref}"
)
elif ref_type == RefType.tags:
return f"{self.forge_root}/{self.project_path}/-/tags/{new_ref}"
elif ref_type == RefType.releases:
return f"{self.forge_root}/{self.project_path}/-/releases/{new_ref}"
else:
raise NotImplementedError
class GiteaForgejoAPI: class GiteaForgejoAPI:
def __init__(self, upstream: str): def __init__(self, upstream: str):
@ -173,6 +194,15 @@ class GiteaForgejoAPI:
"""Get a list of releases for project.""" """Get a list of releases for project."""
return self.internal_api(f"repos/{self.project_path}/releases") return self.internal_api(f"repos/{self.project_path}/releases")
def url_for_ref(self, ref: str, ref_type: RefType) -> str: def url_for_ref(self, ref: str, _: RefType) -> str:
"""Get a URL for a ref.""" """Get a URL for a ref."""
return f"{self.forge_root}/{self.project_path}/archive/{ref}.tar.gz" return f"{self.forge_root}/{self.project_path}/archive/{ref}.tar.gz"
def changelog_for_ref(self, new_ref: str, old_ref: str, ref_type: RefType) -> str:
"""Get a changelog for a ref."""
if ref_type == RefType.commits:
return (
f"{self.forge_root}/{self.project_path}/compare/{old_ref}...{new_ref}"
)
else:
return f"{self.forge_root}/{self.project_path}/releases/tag/{new_ref}"

View file

@ -0,0 +1,557 @@
#!/usr/bin/env python3
import argparse
import os
import re
def cleanup():
comment_blocks_to_cleanup = [
r"#=+\s*\n# GENERIC START\S*\s*\n#=+\s*\n# IMPORT GENERIC HELPERS\n#=+\s*\n",
r"#=+\s*\n# EXPERIMENTAL HELPERS\s*\n#=+\s*\n",
r"#=+\s*\n# FUTURE OFFICIAL HELPERS\s*\n#=+\s*\n",
r"#=+\s*\n# PERSONAL HELPERS\s*\n#=+\s*\n",
r"#=+\s*\n# GENERIC FINALIZATION\s*\n",
r"#=+\s*\n# GENERIC FINALISATION\s*\n",
r"#=+\s*\n# STANDARD MODIFICATIONS\s*\n",
r"#=+\s*\n# STANDARD UPGRADE STEPS\s*\n",
r"#=+\s*\n# SPECIFIC UPGRADE\s*\n",
r"#=+\s*\n# CHECK VERSION\s*\n#=+\s*\n",
r"#=+\s*\n# DECLARE DATA AND CONF FILES TO BACKUP\s*\n#=+\s*\n",
]
removememaybes = [
"ynh_legacy_permissions_exists",
"ynh_legacy_permissions_delete_all",
"ynh_webpath_available",
"ynh_webpath_register",
"ynh_psql_test_if_first_run",
"ynh_backup_before_upgrade",
"ynh_restore_upgradebackup",
"ynh_find_port",
"ynh_port_available",
"ynh_require_ram",
"--ignore_swap",
"--only_swap",
"ynh_print_log",
"ynh_print_OFF",
"ynh_print_ON",
"local legacy_args",
"ynh_abort_if_errors",
"ynh_clean_setup",
]
replaces = [
# Unecessary exec_warn_less
(r"ynh_exec_warn_less ynh_secure_remove", "ynh_secure_remove"),
(r"ynh_exec_warn_less ynh_systemd_action", "ynh_systemctl"),
(r"ynh_exec_warn_less ynh_install_nodejs", "ynh_install_nodejs"),
(r"ynh_exec_warn_less ynh_install_go", "ynh_install_go"),
(r"ynh_exec_warn_less ynh_install_ruby", "ynh_install_ruby"),
(r"ynh_exec_warn_less ynh_composer_exec", "ynh_composer_exec"),
(r"ynh_exec_warn_less ynh_install_composer", "ynh_install_composer"),
# Setting get/set
(r" ?--app=? ?\"?\$app\"?", ""),
# Misc
(r"ynh_validate_ip4", "ynh_validate_ip --family=4"),
(r"ynh_validate_ip4", "ynh_validate_ip --family=6"),
(r"\$\(ynh_get_debian_release\)", "$YNH_DEBIAN_VERSION"),
(r"ynh_read_manifest --manifest\S*", "ynh_read_manifest"),
(r"--manifest_key", "--key"),
(r"COMMON VARIABLES\s*$", "COMMON VARIABLES AND CUSTOM HELPERS"),
(r"ynh_string_random ([0-9])", "ynh_string_random --length=\\1"),
(
r"ynh_backup_if_checksum_is_different --file=?",
"ynh_backup_if_checksum_is_different ",
),
(r"ynh_store_file_checksum --file=?", "ynh_store_file_checksum "),
(r"ynh_delete_file_checksum --file=?", "ynh_delete_file_checksum "),
(r"\[\[?.*PACKAGE_CHECK_EXEC.*eq.*1.*\]\]?", "ynh_in_ci_tests"),
(r"\[\[?.*PACKAGE_CHECK_EXEC.*=.*1.*\]\]?", "ynh_in_ci_tests"),
(r"\[\[?.*PACKAGE_CHECK_EXEC.*ne.*1.*\]\]?", "! ynh_in_ci_tests"),
(r"\[\[?.*PACKAGE_CHECK_EXEC.*eq.*0.*\]\]?", "! ynh_in_ci_tests"),
(r"\[\[?.*PACKAGE_CHECK_EXEC.*ne.*0.*\]\]?", "ynh_in_ci_tests"),
# ynh_setup_source
(r"--full_replace=1", "--full_replace"),
(r"sources/patches", "patches"),
(r"sources/extra_files/app", "sources"),
(r"sources/extra_files", "sources"),
(
r"((chmod|chown).*\"?\$install_dir\"?)\s*$",
"#REMOVEME? Assuming the install dir is setup using ynh_setup_source, the proper chmod/chowns are now already applied and it shouldn't be necessary to tweak perms | \\1",
),
# Logging
(r"ynh_print_err", "ynh_print_warn"),
(r"ynh_exec_quiet ?", ""),
(r"ynh_exec_fully_quiet ?", ""),
(r"ynh_exec_warn_less", "ynh_hide_warnings"),
(r"--message=?", ""),
(r"--time ", ""),
(r"--last", ""),
(r"\s*--weight=?\S*", ""),
# rm
(r"ynh_secure_remove( --file=?)? ?", "ynh_safe_rm "),
# Conf / templating
(r"__NAME__", "__APP__"),
(r"__NAMETOCHANGE__", "__APP__"),
(r"ynh_render_template", "ynh_config_add --jinja"),
(r"ynh_add_config", "ynh_config_add"),
(r'--template="../conf/', '--template="'),
(r"ynh_replace_vars --file=", "ynh_replace_vars "),
(r"ynh_replace_vars", "_ynh_replace_vars"),
(
r"((chmod|chown)\s[^-+].*\"?(\$install_dir\"?/.*(config|.env|settings|credentials)\S*|\$data_dir\"?/\S+|/etc/(sudoers.d|cron.d|\$app)\"?/\S+|\$(config|cron_path)\"?))",
"#REMOVEME? Assuming the file is setup using ynh_config_add, the proper chmod/chowns are now already applied and it shouldn't be necessary to tweak perms | \\1",
),
# Upgrade stuff
(
r"ynh_compare_current_package_version.*lt.*version\s?=?\"?([0-9\.]+~ynh[0-9])\"?",
"ynh_app_upgrading_from_version_before \\1",
),
(
r"ynh_compare_current_package_version.*le.*version\s?=?\"?([0-9\.]+~ynh[0-9])\"?",
"ynh_app_upgrading_from_version_before_or_equal_to \\1",
),
(r"upgrade_type=\S*", ""),
(
r'if \[\s+"?\$upgrade_type"?\s+==\s+"?UPGRADE_APP"? \]',
"# FIXME: this is still supported but the recommendation is now to *always* re-setup the app sources wether or not the upstream sources changed\nif ynh_app_upstream_version_changed",
),
# Backup/store
(r"ynh_restore\s*$", "ynh_restore_everything"),
# -> Specific trick to remove the --not_mandatory here, but replace it with || true for the other occurences
(r'ynh_restore_file --origin_path="\$data_dir" \S*', 'ynh_restore "$data_dir"'),
(r"ynh_restore_file", "ynh_restore"),
(r"--src_path=?", ""),
(r"--origin_path=?", ""),
(r"--is_big\S*", ""),
(r"--not_mandatory", "|| true"),
# Fail2ban
(r"--max_retry=\S*", ""),
(r"--ports\S*", ""),
(r"ynh_add_fail2ban_config --use_template", "ynh_config_add_fail2ban"),
(r"ynh_add_fail2ban_config", "ynh_config_add_fail2ban"),
(r"ynh_remove_fail2ban_config", "ynh_config_remove_fail2ban"),
# MySQL/Postgresql
(r"ynh_mysql_dump_db \S*\$db_name\"?\s", "ynh_mysql_dump_db "),
(r"ynh_psql_dump_db \S*\$db_name\"?\s", "ynh_psql_dump_db "),
(r"ynh_mysql_connect_as [^<\\]*\s", "ynh_mysql_db_shell "),
(r"ynh_psql_connect_as [^<\\]*\s", "ynh_psql_db_shell "),
(r"ynh_mysql_execute_as_root --sql=?", "ynh_mysql_db_shell <<< "),
(r"ynh_psql_execute_as_root --sql=?", "ynh_psql_db_shell <<< "),
(r'ynh_mysql_execute_as_root "', 'ynh_mysql_db_shell <<< "'),
(r'ynh_psql_execute_as_root "', 'ynh_psql_db_shell <<< "'),
(r"ynh_mysql_execute_as_root '", "ynh_mysql_db_shell <<< '"),
(r"ynh_psql_execute_as_root '", "ynh_psql_db_shell <<< '"),
(r"ynh_psql_execute_as_root --database=?", "ynh_psql_db_shell "),
(r"ynh_mysql_execute_as_root --database=?", "ynh_psql_db_shell "),
(r"--sql=", "<<< "),
(
r"ynh_mysql_execute_file_as_root --database=\"?(\S+)\"? --file=\"?(\S+)\"?",
'ynh_mysql_db_shell "\\1" < "\\2"',
),
(
r"ynh_mysql_execute_file_as_root --file=\"?(\S+)\"? --database=\"?(\S+)\"?",
'ynh_mysql_db_shell "\\2" < "\\1"',
),
(
r"ynh_psql_execute_file_as_root --database=\"?(\S+)\"? --file=\"?(\S+)\"?",
'ynh_psql_db_shell "\\1" < "\\2"',
),
(
r"ynh_psql_execute_file_as_root --file=\"?(\S+)\"? --database=\"?(\S+)\"?",
'ynh_psql_db_shell "\\2" < "\\1"',
),
(r'sql_db_shell "?\$db_name"?', "sql_db_shell "),
(r'--database="?\$db_name"?', ""),
(r'--database="?\$app"?', ""),
(r"ynh_mysql_setup_db", "# FIXMEhelpers2.1 ynh_mysql_create_db"),
(
r"ynh_mysql_remove_db",
"# FIXMEhelpers2.1 ynh_mysql_drop_db && ynh_mysql_drop_user",
),
(r"ynh_psql_setup_db", "# FIXMEhelpers2.1 ynh_psql_create_db"),
(
r"ynh_psql_remove_db",
"# FIXMEhelpers2.1 ynh_psql_drop_db && ynh_psql_drop_user",
),
# PHP / composer
(r" ?--phpversion=\S*", ""),
(r" ?--composerversion=\S*", ""),
(r" ?--usage=\S*", ""),
(r" ?--footprint=\S*", ""),
(
r"--group=www-data",
"# FIXMEhelpers2.1 : --group=www-data to be replaced with php_group=www-data to be added in _common.sh",
),
(r"YNH_COMPOSER_VERSION=", "composer_version="),
(r' --workdir="\$install_dir"', ""),
(r"--workdir=\$install_dir ", ""),
(
r"--workdir",
"# FIXMEhelpers2.1 (replace with composer_workdir=... prior to calling this helper, default is $intall_dir) --workdir",
),
(r"phpversion", "php_version"),
(r"PHPVERSION", "PHP_VERSION"),
(r"ynh_add_fpm_config", "ynh_config_add_phpfpm"),
(r"ynh_remove_fpm_config", "ynh_config_remove_phpfpm"),
(
r"ynh_install_composer",
"ynh_composer_install\nynh_composer_exec install --no-dev ",
),
(r'--install_args="?([^"]+)"?(\s|$)', "\\1\\2"),
(r'--commands="([^"]+)"(\s|$)', "\\1\\2"),
(
r"(^fpm_usage=)",
"#REMOVEME? Everything about fpm_usage is removed in helpers2.1... | \\1",
),
(
r"(^.*\$fpm_usage)",
"#REMOVEME? Everything about fpm_usage is removed in helpers2.1... | \\1",
),
(
r"(^fpm_footprint=)",
"#REMOVEME? Everything about fpm_footprint is removed in helpers2.1... | \\1",
),
(
r"(^.*\$fpm_footprint)",
"#REMOVEME? Everything about fpm_footprint is removed in helpers2.1... | \\1",
),
(
r"(^set__fpm_footprint)",
"#REMOVEME? Everything about fpm_footprint is removed in helpers2.1... | \\1",
),
(
r"(^fpm_free_footprint=)",
"#REMOVEME? Everything about fpm_free_footprint is removed in helpers2.1... | \\1",
),
(
r"(^.*\$fpm_free_footprint)",
"#REMOVEME? Everything about fpm_free_footprint is removed in helpers2.1... | \\1",
),
(
r"(^set__fpm_free_footprint)",
"#REMOVEME? Everything about fpm_free_footprint is removed in helpers2.1... | \\1",
),
# Nodejs
(r'"?\$?ynh_node"?', "node"),
(r"NODEJS_VERSION=", "nodejs_version="),
(r"ynh_install_nodejs \S*", "ynh_nodejs_install"),
(r"ynh_install_nodejs", "ynh_nodejs_install"),
(r"ynh_remove_nodejs", "ynh_nodejs_remove"),
(r"ynh_use_nodejs", ""),
(r'"?\$ynh_node_load_PATH"?', ""),
(r'"?\$ynh_node_load_path"?', ""),
(r'"?\$?ynh_npm"?', "npm"),
(r"(export )?COREPACK_ENABLE_DOWNLOAD_PROMPT=0", ""),
(r"env\s+npm", "npm"),
(r"env\s+pnpm", "pnpm"),
(r"env\s+yarn", "yarn"),
(r"env\s+corepack", "corepack"),
# Ruby
(r'"?\$?ynh_ruby"?', "ruby"),
(r'"?\$?ynh_gem"?', "gem"),
(r"RUBY_VERSION=", "ruby_version="),
(r"ynh_install_ruby \S*", "ynh_ruby_install"),
(r"ynh_install_ruby", "ynh_ruby_install"),
(r"ynh_remove_ruby", "ynh_ruby_remove"),
(r"ynh_use_ruby", ""),
(r'"?\$ynh_ruby_load_PATH"?', ""),
(r'"?\$ynh_ruby_load_path"?', ""),
# Go
(r"^\s*GO_VERSION=", "go_version="),
(r'"?\$?ynh_go"?', "go"),
(r"ynh_install_go \S*", "ynh_go_install"),
(r"ynh_install_go", "ynh_go_install"),
(r"ynh_remove_go", "ynh_go_remove"),
(r"ynh_use_go", ""),
# Mongodb
(r"YNH_MONGO_VERSION", "mongo_version"),
(r"ynh_install_mongo \S*", "ynh_install_mongo"),
(r" --eval", ""),
# ynh_replace_string
(r"ynh_replace_string", "ynh_replace"),
(r"ynh_replace_special_string", "ynh_replace_regex"),
(r"--match_string", "--match"),
(r"--replace_string", "--replace"),
(r"--target_file", "--file"),
(
r"(ynh_replace ('|\"))",
"# FIXMEhelpers2.1: ynh_replace used with positional args. Please add the keywords: --match=, --replace=, --file=\n\\1",
),
# Nginx
(r"ynh_add_nginx_config", "ynh_config_add_nginx"),
(r"ynh_remove_nginx_config", "ynh_config_remove_nginx"),
(r"ynh_change_url_nginx_config", "ynh_config_change_url_nginx"),
# Systemd
(r'--log_path="/var/log/\$app/\$app.log"', ""),
(r'--service="?\$app"?(\s|$)', "\\1"),
(r"--service_name", "--service"),
(r"--line_match", "--wait_until"),
(r' --template="systemd.service"', ""),
(r"ynh_add_systemd_config", "ynh_config_add_systemd"),
(r"ynh_remove_systemd_config --service=?", "ynh_config_remove_systemd"),
(r"ynh_remove_systemd_config", "ynh_config_remove_systemd"),
(r"ynh_systemd_action", "ynh_systemctl"),
# Logrotate
(r"ynh_use_logrotate", "ynh_config_add_logrotate"),
(r"ynh_remove_logrotate", "ynh_config_remove_logrotate"),
(r"--specific_user\S*", ""),
(r"--logfile=?", ""),
(r" ?--non-?append", ""),
(
r"((chmod|chown).*\"?/var/log/\"?\$app)",
"#REMOVEME? Assuming ynh_config_add_logrotate is called, the proper chmod/chowns are now already applied and it shouldn't be necessary to tweak perms | \\1",
),
# Apt
(r"ynh_package_is_installed (--package=)?", "_ynh_apt_package_is_installed"),
(r"ynh_package_version (--package=)?", "_ynh_apt_package_version"),
(r"ynh_package_install", "_ynh_apt_install"),
(
r"ynh_install_extra_app_dependencies",
"ynh_apt_install_dependencies_from_extra_repository",
),
(r"ynh_install_app_dependencies", "ynh_apt_install_dependencies"),
(r"ynh_remove_app_dependencies", "ynh_apt_remove_dependencies"),
(r"ynh_package_autopurge", "_ynh_apt autoremove --purge"),
# Exec as / sudo
(r'ynh_exec_as "?\$app"?( env)?', "ynh_exec_as_app"),
(r'sudo -u "?\$app"?( env)?', "ynh_exec_as_app"),
# Cringy messages?
("Modifying a config file...", "Updating configuration..."),
("Updating a configuration file...", "Updating configuration..."),
("Adding a configuration file...", "Adding $app's configuration..."),
(
"Restoring the systemd configuration...",
"Restoring $app's systemd service...",
),
("Configuring a systemd service...", "Configuring $app's systemd service..."),
("Stopping a systemd service...", "Stopping $app's systemd service..."),
("Starting a systemd service...", "Starting $app's systemd service..."),
# Recommend ynh_app_setting_set_default
(
r"( *if \[.*-z.*:-}.*\].*\n?.*then\n\s+(\S+)=(.+)\n\s+ynh_app_setting_set.*\n\s*fi\n)",
"# FIXMEhelpers2.1: maybe replace with: ynh_app_setting_set_default --key=\\2 --value=\\3\n\\1",
),
# Trailing spaces
(r"\s+$", "\n"),
]
replaces = [
(re.compile(pattern, flags=re.M), replace) for pattern, replace in replaces
]
comment_blocks_to_cleanup = [
re.compile(pattern, flags=re.M) for pattern in comment_blocks_to_cleanup
]
for s in [
"_common.sh",
"install",
"remove",
"upgrade",
"backup",
"restore",
"change_url",
"config",
]:
script = f"scripts/{s}"
if not os.path.exists(script):
continue
content = open(script).read()
if s == "remove":
content = re.sub(
r"(ynh_secure_remove .*/var/log/\$app.*)",
r"#REMOVEME? (Apps should not remove their log dir during remove ... this should only happen if --purge is used, and be handled by the core...) \1",
content,
)
for pattern in comment_blocks_to_cleanup:
content = pattern.sub("", content)
for pattern, replace in replaces:
content = pattern.sub(replace, content)
for remove in removememaybes:
content = content.replace(remove, r"#REMOVEME? " + remove)
open(script, "w").write(content)
# Specific PHP FPM conf patch
if os.path.exists("conf/extra_php-fpm.conf"):
content = open("conf/extra_php-fpm.conf").read()
pattern_upload_max_filesize = r"\nphp_\S*\[upload_max_filesize\] = (\S*)"
pattern_post_max_size = r"\nphp_\S*\[post_max_size\] = (\S*)"
pattern_memory_limit = r"\nphp_\S*\[memory_limit\] = (\S*)"
upload_max_filesize = re.findall(pattern_upload_max_filesize, "\n" + content)
memory_limit = re.findall(pattern_memory_limit, "\n" + content)
if memory_limit:
content = re.sub(pattern_memory_limit, "", content)
memory_limit = memory_limit[0]
install = open("scripts/install").read()
install = re.sub(
"(source /usr/share/yunohost/helpers)",
"\\1\n\nynh_app_setting_set --key=php_memory_limit --value="
+ memory_limit,
install,
)
open("scripts/install", "w").write(install)
upgrade = open("scripts/upgrade").read()
upgrade = re.sub(
"(source /usr/share/yunohost/helpers)",
"\\1\n\nynh_app_setting_set_default --key=php_memory_limit --value="
+ memory_limit,
upgrade,
)
open("scripts/upgrade", "w").write(upgrade)
if upload_max_filesize:
content = re.sub(pattern_upload_max_filesize, "", content)
content = re.sub(pattern_post_max_size, "", content)
upload_max_filesize = upload_max_filesize[0]
if upload_max_filesize != "50M":
install = open("scripts/install").read()
install = re.sub(
"(source /usr/share/yunohost/helpers)",
"\\1\n\nynh_app_setting_set --key=php_upload_max_filesize --value="
+ upload_max_filesize,
install,
)
open("scripts/install", "w").write(install)
upgrade = open("scripts/upgrade").read()
upgrade = re.sub(
"(source /usr/share/yunohost/helpers)",
"\\1\n\nynh_app_setting_set_default --key=php_upload_max_filesize --value="
+ upload_max_filesize,
upgrade,
)
open("scripts/upgrade", "w").write(upgrade)
new_conf_is_empty = all(
line.strip() == "" or line.strip()[0] == ";" for line in content.split("\n")
)
if new_conf_is_empty:
os.system("git rm --quiet -f conf/extra_php-fpm.conf")
else:
open("conf/extra_php-fpm.conf", "w").write(content)
conf_replaces = [
(r"__NAME__", "__APP__"),
(r"__NAMETOCHANGE__", "__APP__"),
(r"__USER__", "__APP__"),
("__YNH_NODE__", "__NODEJS_DIR__/node"),
("__YNH_NPM__", "__NODEJS_DIR__/npm"),
("__YNH_NODE_LOAD_PATH__", "PATH=__PATH_WITH_NODEJS__"),
("__YNH_RUBY_LOAD_PATH__", "PATH=__PATH_WITH_RUBY__"),
("__YNH_GO_LOAD_PATH__", "PATH=__PATH_WITH_GO__"),
("__YNH_RUBY__", "__RUBY_DIR__/ruby"),
("__PHPVERSION__", "__PHP_VERSION__"),
]
for currentpath, folders, files in os.walk("conf"):
for file in files:
path = os.path.join(currentpath, file)
try:
content = open(path).read()
except UnicodeDecodeError:
# Not text?
continue
for pattern, replace in conf_replaces:
content = content.replace(pattern, replace)
open(path, "w").write(content)
git_cmds = [
"git rm --quiet sources/extra_files/*/.gitignore 2>/dev/null",
"git rm --quiet sources/patches/.gitignore 2>/dev/null",
"git mv sources/extra_files/* sources/ 2>/dev/null",
"git mv sources/app/* sources/ 2>/dev/null",
"git mv sources/patches patches/ 2>/dev/null",
"test -e conf/app.sh && git rm --quiet conf/app.src",
"test -e check_process && git rm --quiet check_process",
"test -e scripts/actions && git rm -rf --quiet scripts/actions",
"test -e config_panel.json && git rm --quiet config_panel.json",
"test -e config_panel.toml.example && git rm --quiet config_panel.toml.example",
"git rm $(find ./ -name .DS_Store) 2>/dev/null",
r"grep -q '\*\~' .gitignore 2>/dev/null || echo '*~' >> .gitignore",
r"grep -q '\*.sw\[op\]' .gitignore || echo '*.sw[op]' >> .gitignore",
r"grep -q '\.DS_Store' .gitignore || echo '.DS_Store' >> .gitignore",
"git add .gitignore",
]
for cmd in git_cmds:
os.system(cmd)
# If there's a config panel but the only options are the stupid php usage/footprint stuff
if (
os.path.exists("config_panel.toml")
and os.system(
r"grep -oE '^\s*\[\S+\.\S+\.\S+]' config_panel.toml | grep -qv php_fpm_config"
)
!= 0
):
os.system("git rm --quiet -f config_panel.toml")
os.system("git rm --quiet -f scripts/config")
# Remove scripts/config if no config panel ... most of the time this is only the example config script :|
if os.path.exists("scripts/config") and not os.path.exists("config_panel.toml"):
os.system("git rm --quiet -f scripts/config")
webapp_serving_raw_assets_probably = False
if os.path.exists("conf/nginx.conf"):
nginx_conf = open("conf/nginx.conf").read()
if "alias " in nginx_conf or "root " in nginx_conf:
webapp_serving_raw_assets_probably = True
if os.path.isdir("patches"):
for file in os.listdir("patches"):
if "-" not in file:
continue
source_name, patch_name = file.split("-", 1)
if source_name == "app":
source_name = "main"
os.system(f"mkdir -p 'patches/{source_name}'")
os.system(f"git mv patches/{file} patches/{source_name}/{patch_name}")
# Add helpers_version = '2.1' after yunohost requirement in manifest
raw_manifest = open("manifest.toml", "r").read()
if "helpers_version" not in raw_manifest:
raw_manifest = re.sub(
"(yunohost = .*)", '\\1\nhelpers_version = "2.1"', raw_manifest
)
raw_manifest = re.sub(
r'yunohost = ">= 11\..*"', 'yunohost = ">= 11.2.18"', raw_manifest
)
if webapp_serving_raw_assets_probably:
raw_manifest = re.sub(
r"( *)\[resources.install_dir\]",
'\\1[resources.install_dir]\n\\1group = "www-data:r-x"',
raw_manifest,
)
open("manifest.toml", "w").write(raw_manifest)
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Attempt to automatically apply changes to use YunoHost helpers v2.1 on a v2 app"
)
parser.add_argument("app_path", help="Path to the app to convert")
args = parser.parse_args()
if not os.path.exists(args.app_path + "/manifest.toml"):
raise Exception("There is no manifest.toml. Is this really an app directory ?")
os.chdir(args.app_path)
cleanup()

View file

@ -8,23 +8,26 @@ msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-03-31 19:33+0200\n" "POT-Creation-Date: 2024-03-31 19:33+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: 2024-07-27 02:54+0000\n"
"Last-Translator: Automatically generated\n" "Last-Translator: cjdw <cjdw@users.noreply.translate.yunohost.org>\n"
"Language-Team: none\n" "Language-Team: Indonesian <https://translate.yunohost.org/projects/yunohost/"
"readme-generator/id/>\n"
"Language: id\n" "Language: id\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.4.3\n"
"Generated-By: Babel 2.14.0\n" "Generated-By: Babel 2.14.0\n"
#: templates/ALL_README.md.j2:11 #: templates/ALL_README.md.j2:11
#, python-format #, python-format
msgid "Read the README in %(language)s" msgid "Read the README in %(language)s"
msgstr "" msgstr "Baca README dalam bahasa %(language)s"
#: templates/README.md.j2:2 #: templates/README.md.j2:2
msgid "Packaging an app, starting from this example" msgid "Packaging an app, starting from this example"
msgstr "" msgstr "Memaket satu aplikasi, dimulai dari contoh ini"
#: templates/README.md.j2:4 #: templates/README.md.j2:4
msgid "" msgid ""
@ -32,32 +35,41 @@ msgid ""
"github.com/new?template_name=example_ynh&template_owner=YunoHost) button on " "github.com/new?template_name=example_ynh&template_owner=YunoHost) button on "
"the Github repo" "the Github repo"
msgstr "" msgstr ""
"Salin aplikasi ini sebelum mengerjakannya, menggunakan tombol ['Gunakan "
"templat ini'](https://github.com/"
"new?template_name=example_ynh&template_owner=YunoHost) di repo Github"
#: templates/README.md.j2:5 #: templates/README.md.j2:5
msgid "Edit the `manifest.toml` with app specific info" msgid "Edit the `manifest.toml` with app specific info"
msgstr "" msgstr "Edit `manifest.toml` dengan info khas aplikasi"
#: templates/README.md.j2:6 #: templates/README.md.j2:6
msgid "" msgid ""
"Edit the `install`, `upgrade`, `remove`, `backup` and `restore` scripts, and " "Edit the `install`, `upgrade`, `remove`, `backup` and `restore` scripts, and "
"any relevant conf files in `conf/`" "any relevant conf files in `conf/`"
msgstr "" msgstr ""
"Edit skrip `install`, `upgrade`, `remove`, `backup` and `restore`, dan "
"setiap berkas conf yang relevan dalam `conf/`"
#: templates/README.md.j2:7 #: templates/README.md.j2:7
msgid "" msgid ""
"Using the [script helpers documentation](https://yunohost.org/" "Using the [script helpers documentation](https://yunohost.org/"
"packaging_apps_helpers)" "packaging_apps_helpers)"
msgstr "" msgstr ""
"Menggunakan [dokumentasi pembantu skrip](https://yunohost.org/"
"packaging_apps_helpers)"
#: templates/README.md.j2:8 #: templates/README.md.j2:8
msgid "" msgid ""
"Edit the `change_url` and `config` scripts too, or remove them if you have " "Edit the `change_url` and `config` scripts too, or remove them if you have "
"no use of them" "no use of them"
msgstr "" msgstr ""
"Juga edit skrip `change_url` dan `config`, atau singkirkan mereka bila Anda "
"sudah tidak memerlukannya"
#: templates/README.md.j2:9 #: templates/README.md.j2:9
msgid "Add a `LICENSE` file for the package." msgid "Add a `LICENSE` file for the package."
msgstr "" msgstr "Tambah berkas `LICENSE` pada paket."
#: templates/README.md.j2:10 #: templates/README.md.j2:10
msgid "" msgid ""
@ -66,18 +78,26 @@ msgid ""
"published with and you can choose it freely! (If you don't know which to " "published with and you can choose it freely! (If you don't know which to "
"choose, we recommend [the AGPL-3](https://www.gnu.org/licenses/agpl-3.0.txt))" "choose, we recommend [the AGPL-3](https://www.gnu.org/licenses/agpl-3.0.txt))"
msgstr "" msgstr ""
"NB: berkas `LICENSE` ini tidak dimaksudkan untuk selalu sama dengan aplikasi "
"hulu - hanya LICENSE yang Anda inginkan untuk menerbitkan kode paket ini dan "
"Anda bisa bebas memilihnya! (Bila Anda tidak tahu mana yang harus dipilih, "
"kami sarankan [the AGPL-3](https://www.gnu.org/licenses/agpl-3.0.txt))"
#: templates/README.md.j2:11 #: templates/README.md.j2:11
msgid "" msgid ""
"Edit files under the `doc/` directory ([see the page about documenting " "Edit files under the `doc/` directory ([see the page about documenting "
"packages](https://yunohost.org/packaging_app_doc))" "packages](https://yunohost.org/packaging_app_doc))"
msgstr "" msgstr ""
"Edit berkas di bawah direktori `doc/` ([lihat halaman mengenai "
"mendokumentasikan paket](https://yunohost.org/packaging_app_doc))"
#: templates/README.md.j2:12 #: templates/README.md.j2:12
msgid "" msgid ""
"The `README.md` files are to be automatically generated by <https://github." "The `README.md` files are to be automatically generated by <https://github."
"com/YunoHost/apps/tree/master/tools/readme_generator>" "com/YunoHost/apps/tree/master/tools/readme_generator>"
msgstr "" msgstr ""
"Berkas `README.md` akan dibuat secara otomatis oleh <https://github.com/"
"YunoHost/apps/tree/master/tools/readme_generator>"
#: templates/README.md.j2:18 #: templates/README.md.j2:18
msgid "" msgid ""
@ -85,32 +105,35 @@ msgid ""
"YunoHost/apps/tree/master/tools/readme_generator>\n" "YunoHost/apps/tree/master/tools/readme_generator>\n"
"It shall NOT be edited by hand." "It shall NOT be edited by hand."
msgstr "" msgstr ""
"N.B.: README ini dibuat secara otomatis oleh <https://github.com/YunoHost/"
"apps/tree/master/tools/readme_generator>\n"
"Ini TIDAK boleh diedit dengan tangan."
#: templates/README.md.j2:22 #: templates/README.md.j2:22
#, python-format #, python-format
msgid "%(application_name)s for YunoHost" msgid "%(application_name)s for YunoHost"
msgstr "" msgstr "%(application_name)s untuk YunoHost"
#: templates/README.md.j2:24 #: templates/README.md.j2:24
msgid "Integration level" msgid "Integration level"
msgstr "" msgstr "Tingkat integrasi"
#: templates/README.md.j2:24 #: templates/README.md.j2:24
msgid "Working status" msgid "Working status"
msgstr "" msgstr "Status kerja"
#: templates/README.md.j2:24 #: templates/README.md.j2:24
msgid "Maintenance status" msgid "Maintenance status"
msgstr "" msgstr "Status pemeliharaan"
#: templates/README.md.j2:26 #: templates/README.md.j2:26
#, python-format #, python-format
msgid "Install %(application_name)s with YunoHost" msgid "Install %(application_name)s with YunoHost"
msgstr "" msgstr "Pasang %(application_name)s dengan YunoHost"
#: templates/README.md.j2:28 #: templates/README.md.j2:28
msgid "Read this README in other languages." msgid "Read this README in other languages."
msgstr "" msgstr "Baca README ini dengan bahasa yang lain."
#: templates/README.md.j2:30 #: templates/README.md.j2:30
#, python-format #, python-format
@ -118,73 +141,78 @@ msgid ""
"This package allows you to install %(application_name)s quickly and simply " "This package allows you to install %(application_name)s quickly and simply "
"on a YunoHost server." "on a YunoHost server."
msgstr "" msgstr ""
"Paket ini memperbolehkan Anda untuk memasang %(application_name)s secara "
"cepat dan mudah pada server YunoHost."
#: templates/README.md.j2:31 #: templates/README.md.j2:31
msgid "" msgid ""
"If you don't have YunoHost, please consult [the guide](https://yunohost.org/" "If you don't have YunoHost, please consult [the guide](https://yunohost.org/"
"install) to learn how to install it." "install) to learn how to install it."
msgstr "" msgstr ""
"Bila Anda tidak mempunyai YunoHost, silakan berkonsultasi dengan "
"[panduan](https://yunohost.org/install) untuk mempelajari bagaimana untuk "
"memasangnya."
#: templates/README.md.j2:33 #: templates/README.md.j2:33
msgid "Overview" msgid "Overview"
msgstr "" msgstr "Ringkasan"
#: templates/README.md.j2:37 #: templates/README.md.j2:37
msgid "Shipped version:" msgid "Shipped version:"
msgstr "" msgstr "Versi terkirim:"
#: templates/README.md.j2:41 #: templates/README.md.j2:41
msgid "Demo:" msgid "Demo:"
msgstr "" msgstr "Demo:"
#: templates/README.md.j2:45 #: templates/README.md.j2:45
msgid "Screenshots" msgid "Screenshots"
msgstr "" msgstr "Tangkapan Layar"
#: templates/README.md.j2:48 #: templates/README.md.j2:48
#, python-format #, python-format
msgid "Screenshot of %(application_name)s" msgid "Screenshot of %(application_name)s"
msgstr "" msgstr "Tangkapan Layar pada %(application_name)s"
#: templates/README.md.j2:53 #: templates/README.md.j2:53
msgid "Disclaimers / important information" msgid "Disclaimers / important information"
msgstr "" msgstr "Sangkalan / informasi penting"
#: templates/README.md.j2:59 #: templates/README.md.j2:59
msgid "Antifeatures" msgid "Antifeatures"
msgstr "" msgstr "Antifitur"
#: templates/README.md.j2:66 #: templates/README.md.j2:66
msgid "Documentation and resources" msgid "Documentation and resources"
msgstr "" msgstr "Dokumentasi dan sumber daya"
#: templates/README.md.j2:68 #: templates/README.md.j2:68
msgid "Official app website:" msgid "Official app website:"
msgstr "" msgstr "Website aplikasi resmi:"
#: templates/README.md.j2:70 #: templates/README.md.j2:70
msgid "Official user documentation:" msgid "Official user documentation:"
msgstr "" msgstr "Dokumentasi pengguna resmi:"
#: templates/README.md.j2:72 #: templates/README.md.j2:72
msgid "Official admin documentation:" msgid "Official admin documentation:"
msgstr "" msgstr "Dokumentasi admin resmi:"
#: templates/README.md.j2:74 #: templates/README.md.j2:74
msgid "Upstream app code repository:" msgid "Upstream app code repository:"
msgstr "" msgstr "Depot kode aplikasi hulu:"
#: templates/README.md.j2:76 #: templates/README.md.j2:76
msgid "YunoHost Store:" msgid "YunoHost Store:"
msgstr "" msgstr "Gudang YunoHost:"
#: templates/README.md.j2:77 #: templates/README.md.j2:77
msgid "Report a bug:" msgid "Report a bug:"
msgstr "" msgstr "Laporkan bug:"
#: templates/README.md.j2:79 #: templates/README.md.j2:79
msgid "Developer info" msgid "Developer info"
msgstr "" msgstr "Info developer"
#: templates/README.md.j2:81 #: templates/README.md.j2:81
#, python-format #, python-format
@ -192,15 +220,16 @@ msgid ""
"Please send your pull request to the [`testing` branch]" "Please send your pull request to the [`testing` branch]"
"(%(testing_branch_url)s)." "(%(testing_branch_url)s)."
msgstr "" msgstr ""
"Silakan kirim pull request ke [`testing` branch](%(testing_branch_url)s)."
#: templates/README.md.j2:83 #: templates/README.md.j2:83
msgid "To try the `testing` branch, please proceed like that:" msgid "To try the `testing` branch, please proceed like that:"
msgstr "" msgstr "Untuk mencoba branch `testing`, silakan dilanjutkan seperti:"
#: templates/README.md.j2:87 #: templates/README.md.j2:87
msgid "or" msgid "or"
msgstr "" msgstr "atau"
#: templates/README.md.j2:91 #: templates/README.md.j2:91
msgid "More info regarding app packaging:" msgid "More info regarding app packaging:"
msgstr "" msgstr "Info lebih lanjut mengenai pemaketan aplikasi:"

View file

@ -497,6 +497,14 @@ upstream = "https://github.com/docker/distribution/"
website = "" website = ""
added_date = 1695656621 # 2023/09/25 added_date = 1695656621 # 2023/09/25
[docmost]
name = "Docmost."
description = "Wiki and documentation software"
upstream = "https://github.com/docmost/docmost"
website = "https://docmost.com/"
added_date = 1721053354 # 2024/07/15
[docspell] [docspell]
name = "Docspell" name = "Docspell"
description = "Simple document organizer" description = "Simple document organizer"
@ -787,6 +795,14 @@ upstream = "https://github.com/graphhopper/graphhopper"
website = "https://www.graphhopper.com/" website = "https://www.graphhopper.com/"
added_date = 1695656621 # 2023/09/25 added_date = 1695656621 # 2023/09/25
[graylog]
name = "Graylog"
description = "log management platform"
upstream = "https://github.com/Graylog2/graylog2-server"
website = "https://www.graylog.org/"
added_date = 1721053741 # 2024/07/15
[greenlight] [greenlight]
name = "Greenlight" name = "Greenlight"
description = "A really simple end-user interface for your BigBlueButton server" description = "A really simple end-user interface for your BigBlueButton server"