1
1
mirror of https://gitlab.gnome.org/GNOME/gimp.git synced 2025-10-06 01:12:40 +02:00

Compare commits

...

11 Commits

Author SHA1 Message Date
Jacob Boerema
6451ce3c80 app: fix #13555 crash in clipboard when closing
Apparently the gimpclipboard_send_* functions can be called when
gimp_clip has already been cleared, usually at shutdown. This is
causing crashes sometimes that I have not been able to reproduce.

Fixing this at the source would be best, but I have not been able to
figure out where that would be. So, next best thing is adding a check
to bail out early when gimp_clip is NULL.
2025-10-02 12:08:55 -04:00
Alx Sa
81c67e5614 tools: Don't commit Filter Tool without a filter
The Filter Tool is a "hidden" tool that we switch to
when applying a filter. Like other tools, it commits when
we save our image. However, we may no longer have an
active filter in the tool when we do so (like, after applying
an NDE filter). Because we check the drawable from the
filter to confirm whether we should force NDE or not,
this can cause a CRITICAL when we try to access a now
non-existent filter.

This patch extends the "if (filter_tool->filter)" check to
cover the full commit check process, to prevent the bug.
2025-10-02 12:07:25 +00:00
Øyvind Kolås
67fa72a94e meson, app: depend on babl-0.1.116 2025-10-02 13:22:29 +02:00
Yuri Chornoivan
6587256c3a Update Ukrainian translation 2025-10-02 08:21:41 +00:00
Bruno Lopes
ad9dbf2c8b tools: Drop bashism/gnushism in read command 2025-10-01 21:26:25 -03:00
Bruno Lopes
2f0bfc569b meson: Fix wrong debugging_format detection on clang-cl and msvc 2025-10-01 20:13:33 -03:00
Alx Sa
36330a271a tools: Prevent bucket fill on link/vector layers
Resolves #14993
We currently prevent paint tools from painting on
link or vector layers. However, we had not added this
protection to the bucket fill tool. This patch copies over
the relevant if statements to prevent this.
2025-10-01 13:23:09 +00:00
Jehan
baa4825880 app: use the new release/ alias URLs for the "Learn more" link of…
… Release Notes tab.
2025-10-01 14:40:18 +02:00
Jehan
8c910c2b6b tools: improve release stats.
- Interactively query the release version from standard input.
- Compute the logical previous version but also the previous release in
  time. For instance the logical previous release of GIMP 3.0.6 will be
  3.0.4 but the time-wise previous release will be 3.1.4.
- Some statistics will use the logical previous release whereas others
  the time-wise one.
2025-10-01 14:39:51 +02:00
Marco Ciampa
a025cfe41b Updated Italian translation 2025-10-01 12:37:59 +02:00
Jehan
41035c7589 plug-ins: fix memory management and handle multi-file zip.
We should not call archive_entry_free() since man
archive_read_next_header explicitly says that the returned entry is an
internal object:

> This is a convenience wrapper around archive_read_next_header2() that
> reuses an internal struct archive_entry object for each request.

The only reason why it was not crashing is that we were not properly
freeing the archive itself so internal objects were hanging! The man
archive_read says:

> Once you have finished reading data from the archive, you should call
> archive_read_close() to close the archive, then call archive_read_free()
> to release all resources, including all memory allocated by the library.

Therefore this code add archive_read_free() at the end and removes
archive_entry_free().

Furthermore we now verify if the zip archive contains any other file.
Unlike all other compression formats we were supporting until now, zip
is a full multi-file container format and we are always only trying to
read the first file listed in the archive. This likely means that this
file was not meant to be opened this way. In any case, still try to load
the first file as an image, yet raise a warning about the existence of
more files in the archive.
2025-09-30 20:14:01 +02:00
10 changed files with 340 additions and 164 deletions

View File

@@ -1125,10 +1125,19 @@ welcome_dialog_create_release_page (Gimp *gimp,
tmp = g_strdup_printf (GIMP_VERSION);
if (GIMP_MINOR_VERSION % 2 == 0 && ! strstr (tmp, "RC"))
release_link = g_strdup_printf ("https://www.gimp.org/release-notes/gimp-%d.%d.html",
GIMP_MAJOR_VERSION, GIMP_MINOR_VERSION);
{
if (GIMP_MICRO_VERSION == 0 && ! strstr (tmp, "RC"))
release_link = g_strdup_printf ("https://www.gimp.org/release-notes/gimp-%d.%d.html",
GIMP_MAJOR_VERSION, GIMP_MINOR_VERSION);
else
release_link = g_strdup_printf ("https://www.gimp.org/release/%d.%d.%d/",
GIMP_MAJOR_VERSION, GIMP_MINOR_VERSION,
GIMP_MICRO_VERSION);
}
else
release_link = g_strdup ("https://www.gimp.org/");
{
release_link = g_strdup ("https://www.gimp.org/");
}
g_free (tmp);
widget = gtk_link_button_new_with_label (release_link, _("Learn more"));

View File

@@ -464,7 +464,7 @@ sanity_check_babl (void)
#define BABL_REQUIRED_MAJOR 0
#define BABL_REQUIRED_MINOR 1
#define BABL_REQUIRED_MICRO 114
#define BABL_REQUIRED_MICRO 116
babl_get_version (&babl_major_version,
&babl_minor_version,

View File

@@ -39,6 +39,7 @@
#include "core/gimpimageproxy.h"
#include "core/gimpitem.h"
#include "core/gimplineart.h"
#include "core/gimplinklayer.h"
#include "core/gimppickable.h"
#include "core/gimppickable-contiguous-region.h"
#include "core/gimpprogress.h"
@@ -50,6 +51,8 @@
#include "operations/layer-modes/gimp-layer-modes.h"
#include "path/gimpvectorlayer.h"
#include "widgets/gimphelp-ids.h"
#include "widgets/gimpwidgets-utils.h"
@@ -620,7 +623,21 @@ gimp_bucket_fill_tool_button_press (GimpTool *tool,
return;
}
if (gimp_item_is_content_locked (GIMP_ITEM (drawable), &locked_item))
if (gimp_item_is_link_layer (GIMP_ITEM (drawable)))
{
gimp_tool_message_literal (tool, display,
_("Link layers must be rasterized "
"before they can be painted on."));
return;
}
else if (gimp_item_is_vector_layer (GIMP_ITEM (drawable)))
{
gimp_tool_message_literal (tool, display,
_("Vector layers must be rasterized "
"before they can be painted on."));
return;
}
else if (gimp_item_is_content_locked (GIMP_ITEM (drawable), &locked_item))
{
gimp_tool_message_literal (tool, display,
_("The selected layer's pixels are locked."));

View File

@@ -562,48 +562,50 @@ gimp_filter_tool_control (GimpTool *tool,
case GIMP_TOOL_ACTION_COMMIT:
if (filter_tool->filter)
drawable = gimp_drawable_filter_get_drawable (filter_tool->filter);
/* TODO: Expand non-destructive editing to other drawables
* besides layers and channels */
if ((! GIMP_IS_LAYER (drawable) && ! GIMP_IS_CHANNEL (drawable)) ||
GIMP_IS_LAYER_MASK (drawable) ||
(! filter_tool->existing_filter && options->merge_filter))
non_destructive = FALSE;
if (filter_tool->operation)
{
gegl_node_get (filter_tool->operation,
"operation", &operation_name,
NULL);
drawable = gimp_drawable_filter_get_drawable (filter_tool->filter);
if (! g_strcmp0 (operation_name, "gegl:nop"))
/* TODO: Expand non-destructive editing to other drawables
* besides layers and channels */
if ((! GIMP_IS_LAYER (drawable) && ! GIMP_IS_CHANNEL (drawable)) ||
GIMP_IS_LAYER_MASK (drawable) ||
(! filter_tool->existing_filter && options->merge_filter))
non_destructive = FALSE;
/* TODO: Once we can serialize GimpDrawable, remove so that filters with
* aux nodes can be non-destructive */
if (gegl_node_has_pad (filter_tool->operation, "aux") ||
/* GEGL graph is dangerous even without using third-party
* effects, because it may run any effect. E.g. it can
* run sink effects overwriting any local files with user
* rights. We leave a way in through an environment
* variable because it is a useful tool for GEGL ops
* developers but it should only be set while knowing what
* you are doing.
*/
(g_strcmp0 (operation_name, "gegl:gegl") == 0 &&
g_getenv ("GIMP_ALLOW_GEGL_GRAPH_LAYER_EFFECT") == NULL))
non_destructive = FALSE;
if (filter_tool->operation)
{
gegl_node_get (filter_tool->operation,
"operation", &operation_name,
NULL);
g_free (operation_name);
if (! g_strcmp0 (operation_name, "gegl:nop"))
non_destructive = FALSE;
/* TODO: Once we can serialize GimpDrawable, remove so that
* filters with aux nodes can be non-destructive */
if (gegl_node_has_pad (filter_tool->operation, "aux") ||
/* GEGL graph is dangerous even without using third-party
* effects, because it may run any effect. E.g. it can
* run sink effects overwriting any local files with user
* rights. We leave a way in through an environment
* variable because it is a useful tool for GEGL ops
* developers but it should only be set while knowing what
* you are doing.
*/
(g_strcmp0 (operation_name, "gegl:gegl") == 0 &&
g_getenv ("GIMP_ALLOW_GEGL_GRAPH_LAYER_EFFECT") == NULL))
non_destructive = FALSE;
g_free (operation_name);
}
/* Ensure that filters applied to group, vector or link layers are
* non-destructive */
if (GIMP_IS_GROUP_LAYER (drawable) ||
gimp_item_is_vector_layer (GIMP_ITEM (drawable)) ||
gimp_item_is_link_layer (GIMP_ITEM (drawable)))
non_destructive = TRUE;
}
/* Ensure that filters applied to group, vector or link layers are non-destructive */
if (GIMP_IS_GROUP_LAYER (drawable) ||
gimp_item_is_vector_layer (GIMP_ITEM (drawable)) ||
gimp_item_is_link_layer (GIMP_ITEM (drawable)))
non_destructive = TRUE;
gimp_filter_tool_commit (filter_tool, non_destructive);
break;
}

View File

@@ -1152,6 +1152,9 @@ gimp_clipboard_send_image (GtkClipboard *clipboard,
{
GimpClipboard *gimp_clip = gimp_clipboard_get (gimp);
if (gimp_clip == NULL)
return;
gimp_set_busy (gimp);
if (info == 0)
@@ -1212,6 +1215,9 @@ gimp_clipboard_send_buffer (GtkClipboard *clipboard,
GimpClipboard *gimp_clip = gimp_clipboard_get (gimp);
GdkPixbuf *pixbuf;
if (gimp_clip == NULL)
return;
gimp_set_busy (gimp);
pixbuf = gimp_viewable_get_pixbuf (GIMP_VIEWABLE (gimp_clip->buffer),
@@ -1256,6 +1262,9 @@ gimp_clipboard_send_svg (GtkClipboard *clipboard,
{
GimpClipboard *gimp_clip = gimp_clipboard_get (gimp);
if (gimp_clip == NULL)
return;
gimp_set_busy (gimp);
if (gimp_clip->svg)
@@ -1280,6 +1289,9 @@ gimp_clipboard_send_curve (GtkClipboard *clipboard,
{
GimpClipboard *gimp_clip = gimp_clipboard_get (gimp);
if (gimp_clip == NULL)
return;
gimp_set_busy (gimp);
if (gimp_clip->curve)

View File

@@ -334,6 +334,9 @@ if get_option('buildtype') == 'debug' or get_option('buildtype') == 'debugoptimi
if not platform_windows
# DWARF symbols for GCC and LLDB on Unix
debugging_format = 'native'
elif cc.get_argument_syntax() == 'msvc'
# CodeView symbols for DIA or DbgHelp debuggers and LLDB on Windows
debugging_format = 'Native'
elif platform_windows and get_option('win-debugging') == 'native' and cc.has_argument('-gcodeview') and cc.has_link_argument('-Wl,--pdb=') and cc.get_id() == 'clang'
# CodeView symbols for DIA or DbgHelp debuggers and LLDB on Windows
debugging_format = 'native'
@@ -406,7 +409,7 @@ winsock = platform_windows ? cc.find_library('ws2_32') : no_dep
mscms = platform_windows ? cc.find_library('mscms') : no_dep
atk_minver = '2.4.0'
atk = dependency('atk', version: '>='+atk_minver)
babl_minver = '0.1.114'
babl_minver = '0.1.116'
babl = dependency('babl-0.1', version: '>='+babl_minver, required: false)
if not babl.found()
# babl changed its pkg-config name from 'babl' to 'babl-0.1' in version
@@ -2046,7 +2049,7 @@ pkgconfig.generate(libgimpui,
# Install native debug data (.pdb) on Windows
# Ideally meson should take care of it automatically.
# See: https://github.com/mesonbuild/meson/issues/12977
if platform_windows and debugging_format == 'native'
if platform_windows and debugging_format == 'native' and cc.get_argument_syntax() != 'msvc'
install_win_debug_script = find_program('build/windows/2_bundle-gimp-uni_sym.py')
meson.add_install_script(install_win_debug_script)
endif

View File

@@ -1083,6 +1083,7 @@ zip_load (GFile *infile,
if (r != ARCHIVE_OK)
{
archive_read_close (a);
archive_read_free (a);
goto out;
}
@@ -1094,13 +1095,22 @@ zip_load (GFile *infile,
if (r != ARCHIVE_OK)
{
archive_read_close (a);
archive_read_free (a);
goto out;
}
archive_entry_free (entry);
ret = TRUE;
if (archive_read_next_header (a, &entry) != ARCHIVE_EOF)
/* Leave a chance for the load to succeed (in case the first
* file happens to be an image file), yet still warns. This
* procedure expects that the archive contains a single
* file.
*/
g_message (_("This zip archive contains more than one file."));
}
archive_read_close (a);
archive_read_free (a);
}
out:

View File

@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gimp-plug-ins\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gimp/issues\n"
"POT-Creation-Date: 2025-09-29 19:54+0000\n"
"PO-Revision-Date: 2025-09-29 22:59+0300\n"
"POT-Creation-Date: 2025-10-02 00:31+0000\n"
"PO-Revision-Date: 2025-10-02 11:21+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
"Language: uk\n"
@@ -2808,19 +2808,87 @@ msgstr "Непрозорість"
msgid "gzip archive"
msgstr "архів gzip"
#: plug-ins/common/file-compressor.c:229
msgid "Loads files compressed with gzip"
msgstr "Завантажує файли, які стиснуто за допомогою gzip"
#: plug-ins/common/file-compressor.c:230
#| msgid ""
#| "This plug-in loads files in the various Netpbm portable file formats."
msgid "This procedure loads files in the gzip compressed format."
msgstr "Ця процедура завантажує файли у стисненому форматі gzip."
#: plug-ins/common/file-compressor.c:234
msgid "Exports files compressed with gzip"
msgstr "Експортує файли, які стиснуто за допомогою gzip"
#: plug-ins/common/file-compressor.c:235
#| msgid "Exports files in the PNM file format"
msgid "This procedure exports files in the gzip compressed format."
msgstr "Ця процедура експортує файли у стисненому форматі gzip."
#: plug-ins/common/file-compressor.c:240
msgid "bzip archive"
msgstr "архів bzip"
#: plug-ins/common/file-compressor.c:248
msgid "Loads files compressed with bzip2"
msgstr "Завантажує файли, які стиснуто за допомогою bzip2"
#: plug-ins/common/file-compressor.c:249
#| msgid ""
#| "This plug-in loads files in the various Netpbm portable file formats."
msgid "This procedure loads files in the bzip2 compressed format."
msgstr "Ця процедура завантажує файли у стисненому форматі bzip2."
#: plug-ins/common/file-compressor.c:253
msgid "Exports files compressed with bzip2"
msgstr "Експортує файли, які стиснуто за допомогою bzip2"
#: plug-ins/common/file-compressor.c:254
#| msgid ""
#| "This plug-in loads files in the various Netpbm portable file formats."
msgid "This procedure exports files in the bzip2 compressed format."
msgstr "Ця процедура експортує файли у стисненому форматі bzip2."
#: plug-ins/common/file-compressor.c:259
msgid "xz archive"
msgstr "архів xz"
#: plug-ins/common/file-compressor.c:267
msgid "Loads files compressed with xz"
msgstr "Завантажує файли, які стиснуто за допомогою xz"
#: plug-ins/common/file-compressor.c:268
#| msgid ""
#| "This plug-in loads files in the various Netpbm portable file formats."
msgid "This procedure loads files in the xz compressed format."
msgstr "Ця процедура завантажує файли у стисненому форматі xz."
#: plug-ins/common/file-compressor.c:272
#| msgid "Error reading compressed data. "
msgid "Exports files compressed with xz"
msgstr "Експортує файли, які стиснуто за допомогою xz"
#: plug-ins/common/file-compressor.c:273
#| msgid "Exports files in the PNM file format"
msgid "This procedure exports files in the xz compressed format."
msgstr "Ця процедура експортує файли у стисненому форматі xz."
#: plug-ins/common/file-compressor.c:278
#| msgid "gzip archive"
msgid "zip archive"
msgstr "архів zip"
#: plug-ins/common/file-compressor.c:286
msgid "Loads files compressed with zip"
msgstr "Завантажує файли, які стиснуто за допомогою zip"
#: plug-ins/common/file-compressor.c:287
#| msgid ""
#| "This plug-in loads files in the various Netpbm portable file formats."
msgid "This procedure loads files in the zip compressed format."
msgstr "Ця процедура завантажує файли у стисненому форматі zip."
#: plug-ins/common/file-compressor.c:471
msgid "No sensible file extension, saving as compressed XCF."
msgstr "Немає потрібного розширення, зберігається як стиснутий XCF."
@@ -2834,6 +2902,15 @@ msgstr "Стиснення «%s»"
msgid "No sensible file extension, attempting to load with file magic."
msgstr "Немає потрібного розширення, спроба визначення типу за вмістом файлу."
#. Leave a chance for the load to succeed (in case the first
#. * file happens to be an image file), yet still warns. This
#. * procedure expects that the archive contains a single
#. * file.
#.
#: plug-ins/common/file-compressor.c:1110
msgid "This zip archive contains more than one file."
msgstr "В архіві zip міститься декілька файлів."
#: plug-ins/common/file-desktop-link.c:114
msgid "Desktop Link"
msgstr "Посилання .desktop"

146
po/it.po
View File

@@ -45,8 +45,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gimp 2.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-23 16:13+0200\n"
"PO-Revision-Date: 2025-09-23 16:09+0200\n"
"POT-Creation-Date: 2025-10-01 12:30+0200\n"
"PO-Revision-Date: 2025-10-01 12:37+0200\n"
"Last-Translator: Marco Ciampa <ciampix@posteo.net>\n"
"Language-Team: gimp@erlug.linux.it\n"
"Language: it\n"
@@ -124,7 +124,15 @@ msgstr ""
msgid "If you wanted to quit immediately instead, call GIMP with --quit."
msgstr "Se invece si desidera uscire immediatamente, chiamare GIMP con --quit."
#: ../app/gimp-update.c:444
#: ../app/gimp-update.c:424
msgid "Perhaps you are missing GIO backends and need to install GVFS?"
msgstr "Forse mancano i backend GIO e bisogna installare GVFS?"
#: ../app/gimp-update.c:429
msgid "Perhaps you are missing GIO backends."
msgstr "Forse mancano i backend GIO."
#: ../app/gimp-update.c:466
#, c-format
msgid ""
"A new version of GIMP (%s) was released.\n"
@@ -2535,8 +2543,8 @@ msgid "Enter a description for the marker"
msgstr "Inserire una descrizione per il marcatore"
#: ../app/actions/data-commands.c:90 ../app/actions/documents-commands.c:393
#: ../app/actions/file-commands.c:234 ../app/dialogs/file-open-dialog.c:253
#: ../app/dialogs/file-open-dialog.c:295
#: ../app/actions/file-commands.c:234 ../app/dialogs/file-open-dialog.c:254
#: ../app/dialogs/file-open-dialog.c:300
#: ../app/dialogs/file-open-location-dialog.c:217
#: ../app/dialogs/file-open-location-dialog.c:233
#: ../app/display/gimpdisplayshell-dnd.c:646
@@ -3053,134 +3061,124 @@ msgctxt "dialogs-action"
msgid "Open the dashboard"
msgstr "Apri il cruscotto"
#: ../app/actions/dialogs-actions.c:311 ../app/actions/dialogs-actions.c:312
msgctxt "dialogs-action"
msgid "_Settings..."
msgstr "Impo_stazioni..."
#: ../app/actions/dialogs-actions.c:314 ../app/actions/dialogs-actions.c:315
#: ../app/actions/dialogs-actions.c:310 ../app/actions/dialogs-actions.c:311
msgctxt "dialogs-action"
msgid "_Preferences"
msgstr "_Preferenze"
#: ../app/actions/dialogs-actions.c:318
#: ../app/actions/dialogs-actions.c:313
msgctxt "dialogs-action"
msgid "Open the preferences dialog"
msgstr "Apri la finestra delle preferenze"
#: ../app/actions/dialogs-actions.c:323
#: ../app/actions/dialogs-actions.c:318
msgctxt "dialogs-action"
msgid "_Input Devices Editor"
msgstr "Editor dispositivi di _ingresso"
#: ../app/actions/dialogs-actions.c:324
#: ../app/actions/dialogs-actions.c:319
msgctxt "dialogs-action"
msgid "_Input Devices"
msgstr "Dispositivi di _ingresso"
#: ../app/actions/dialogs-actions.c:326
#: ../app/actions/dialogs-actions.c:321
msgctxt "dialogs-action"
msgid "Open the input devices editor"
msgstr "Apri la modifica dei dispositivi d'ingresso"
#: ../app/actions/dialogs-actions.c:331
#: ../app/actions/dialogs-actions.c:326
msgctxt "dialogs-action"
msgid "_Keyboard Shortcuts Editor"
msgstr "Editor _tasti scorciatoia"
#: ../app/actions/dialogs-actions.c:332
#: ../app/actions/dialogs-actions.c:327
msgctxt "dialogs-action"
msgid "_Keyboard Shortcuts"
msgstr "_Tasti scorciatoia"
#: ../app/actions/dialogs-actions.c:334
#: ../app/actions/dialogs-actions.c:329
msgctxt "dialogs-action"
msgid "Open the keyboard shortcuts editor"
msgstr "Apri la modifica dei tasti scorciatoia"
#: ../app/actions/dialogs-actions.c:339
#: ../app/actions/dialogs-actions.c:334
msgctxt "dialogs-action"
msgid "_Modules Dialog"
msgstr "Finestra _moduli"
#: ../app/actions/dialogs-actions.c:340
#: ../app/actions/dialogs-actions.c:335
msgctxt "dialogs-action"
msgid "_Modules"
msgstr "_Moduli"
#: ../app/actions/dialogs-actions.c:342
#: ../app/actions/dialogs-actions.c:337
msgctxt "dialogs-action"
msgid "Open the module manager dialog"
msgstr "Apri finestra di gestione moduli"
#: ../app/actions/dialogs-actions.c:347
#: ../app/actions/dialogs-actions.c:342
msgctxt "dialogs-action"
msgid "_Tip of the Day"
msgstr "Suggerimenti del _giorno"
#: ../app/actions/dialogs-actions.c:349
#: ../app/actions/dialogs-actions.c:344
msgctxt "dialogs-action"
msgid "Show some helpful tips on using GIMP"
msgstr "Mostra alcuni utili suggerimenti sull'uso di GIMP"
#: ../app/actions/dialogs-actions.c:354
#: ../app/actions/dialogs-actions.c:349
msgctxt "dialogs-action"
msgid "Welcome Dialog"
msgstr "Finestra di benvenuto"
#: ../app/actions/dialogs-actions.c:356
#: ../app/actions/dialogs-actions.c:351
msgctxt "dialogs-action"
msgid "Show information on running GIMP release"
msgstr "Mostra informazioni sulla versione di GIMP in esecuzione"
#: ../app/actions/dialogs-actions.c:362 ../app/actions/dialogs-actions.c:369
#: ../app/actions/dialogs-actions.c:357 ../app/actions/dialogs-actions.c:362
msgctxt "dialogs-action"
msgid "About GIMP"
msgstr "Informazioni su GIMP"
#: ../app/actions/dialogs-actions.c:364
msgctxt "dialogs-action"
msgid "About"
msgstr "Informazioni"
#: ../app/actions/dialogs-actions.c:366
#: ../app/actions/dialogs-actions.c:359
msgctxt "dialogs-action"
msgid "_About"
msgstr "_Informazioni"
#: ../app/actions/dialogs-actions.c:374
#: ../app/actions/dialogs-actions.c:367
msgctxt "dialogs-action"
msgid "_Search and Run a Command"
msgstr "Cerca ed e_segui un comando"
#: ../app/actions/dialogs-actions.c:376
#: ../app/actions/dialogs-actions.c:369
msgctxt "dialogs-action"
msgid "Search commands by keyword, and run them"
msgstr "Cerca comandi per parola-chiave e li esegue"
#: ../app/actions/dialogs-actions.c:382
#: ../app/actions/dialogs-actions.c:375
msgctxt "dialogs-action"
msgid "Manage _Extensions"
msgstr "Gestione _estensioni"
#: ../app/actions/dialogs-actions.c:384
#: ../app/actions/dialogs-actions.c:377
msgctxt "dialogs-action"
msgid "Manage Extensions: search, install, uninstall, update."
msgstr "Gestione estensioni: cerca, installa, disinstalla, aggiorna."
#: ../app/actions/dialogs-actions.c:448
#: ../app/actions/dialogs-actions.c:441
msgid "Tool_box"
msgstr "Pannello strumenti"
#: ../app/actions/dialogs-actions.c:449
#: ../app/actions/dialogs-actions.c:442
msgid "Raise the toolbox"
msgstr "Alza il pannello strumenti"
#: ../app/actions/dialogs-actions.c:453
#: ../app/actions/dialogs-actions.c:446
msgid "New Tool_box"
msgstr "Nuovo pannello strum_enti"
#: ../app/actions/dialogs-actions.c:454
#: ../app/actions/dialogs-actions.c:447
msgid "Create a new toolbox"
msgstr "Crea un nuovo pennello strumenti"
@@ -12988,7 +12986,7 @@ msgstr ""
#: ../app/core/gimp-contexts.c:153 ../app/core/gimp-internal-data.c:338
#: ../app/core/gimptooloptions.c:361 ../app/gui/modifiers.c:191
#: ../app/gui/session.c:449 ../app/menus/menus.c:480
#: ../app/gui/session.c:449 ../app/menus/menus.c:488
#: ../app/widgets/gimpdevices.c:226
#, c-format
msgid "Deleting \"%s\" failed: %s"
@@ -14960,11 +14958,11 @@ msgstr "Lunghezza massima chiusura diritta"
msgid "Maximum straight length (in pixels) to close the line art"
msgstr "Lunghezza massima retta (in pixel) per chiudere il tratteggio"
#: ../app/core/gimplink.c:255
#: ../app/core/gimplink.c:256
msgid "The file got deleted"
msgstr "Il file è stato eliminato"
#: ../app/core/gimplink.c:349
#: ../app/core/gimplink.c:351
msgid "No file was set"
msgstr "Nessun file impostato"
@@ -16146,10 +16144,15 @@ msgid "Search extensions matching these keywords"
msgstr "Cerca le estensioni che corrispondono a queste parole chiave"
#: ../app/dialogs/file-open-dialog.c:142 ../app/dialogs/file-open-dialog.c:168
#: ../app/dialogs/file-open-dialog.c:286
#: ../app/dialogs/file-open-dialog.c:291
msgid "Open layers"
msgstr "Apri livelli"
#: ../app/dialogs/file-open-dialog.c:258
#, c-format
msgid "Opening '%s' failed."
msgstr "L'apertura di '%s' è fallita."
#: ../app/dialogs/file-open-location-dialog.c:74
msgid "Open Location"
msgstr "Apri posizione"
@@ -18867,13 +18870,13 @@ msgid "GIMP website"
msgstr "Il sito di GIMP"
#: ../app/dialogs/welcome-dialog.c:545
msgid "Tutorials"
msgstr "Guide"
#: ../app/dialogs/welcome-dialog.c:550
msgid "Documentation"
msgstr "Documentazione"
#: ../app/dialogs/welcome-dialog.c:550
msgid "Community Tutorials"
msgstr "Guide della comunità"
#. XXX: should we add API docs for plug-in developers once it's
#. * properly set up?
#. Welcome message: right
@@ -19920,26 +19923,26 @@ msgstr "Clic e trascina per spostare il punto cardine"
msgid "Click-Drag to shear"
msgstr "Clic e trascina per inclinare"
#: ../app/file/file-open.c:264
#: ../app/file/file-open.c:272
#, c-format
msgid "%s plug-in returned SUCCESS but did not return an image"
msgstr "Il plug-in %s ha risposto successo ma non ha restituito un'immagine"
#: ../app/file/file-open.c:275
#: ../app/file/file-open.c:283
#, c-format
msgid "%s plug-in could not open image"
msgstr "Il plug-in %s non poteva aprire l'immagine"
#: ../app/file/file-open.c:690
#: ../app/file/file-open.c:698
msgid "Image doesn't contain any layers"
msgstr "L'immagine non contiene nessun livello"
#: ../app/file/file-open.c:748
#: ../app/file/file-open.c:756
#, c-format
msgid "Opening '%s' failed: %s"
msgstr "L'apertura di \"%s\" è fallita: %s"
#: ../app/file/file-open.c:836
#: ../app/file/file-open.c:846
#, c-format
msgid ""
"Only platform-native file paths are supported: '%s' cannot be opened as link."
@@ -19947,11 +19950,11 @@ msgstr ""
"Sono supportati solo i percorsi file nativi della piattaforma: '%s' non può "
"essere aperto come collegamento."
#: ../app/file/file-open.c:978 ../app/file/file-save.c:132
#: ../app/file/file-open.c:985 ../app/file/file-save.c:132
msgid "Not a regular file"
msgstr "Non è un file normale"
#: ../app/file/file-open.c:987 ../app/file/file-save.c:141
#: ../app/file/file-open.c:994 ../app/file/file-save.c:141
msgid "Permission denied"
msgstr "Permesso negato"
@@ -21716,11 +21719,7 @@ msgstr "Ruota livello vettoriale"
msgid "Transform Vector Layer"
msgstr "Trasforma livello vettoriale"
#: ../app/path/gimpvectorlayer.c:526
msgid "Discard Vector Informations"
msgstr "Abbandona le informazioni vettoriali"
#: ../app/path/gimpvectorlayer.c:669
#: ../app/path/gimpvectorlayer.c:526 ../app/path/gimpvectorlayer.c:669
msgid "Discard Vector Information"
msgstr "Abbandona le informazioni vettoriali"
@@ -22277,7 +22276,7 @@ msgstr "Autoritaglio immagine"
msgid "Autocrop layer"
msgstr "Autoritaglio livello"
#: ../app/pdb/image-cmds.c:2556
#: ../app/pdb/image-cmds.c:2564
msgid ""
"Image resolution is out of bounds, using the default resolution instead."
msgstr ""
@@ -22306,43 +22305,48 @@ msgstr "Trasformazione 2D"
msgid "2D Transforming"
msgstr "Trasformazione 2D in corso"
#: ../app/pdb/link-layer-cmds.c:67 ../app/pdb/link-layer-cmds.c:89
#, c-format
msgid "Failed to create link layer"
msgstr "Impossibile creare livello collegato"
#: ../app/pdb/path-cmds.c:325
msgid "Remove path stroke"
msgstr "Rimuovi delineatura del tracciato"
#: ../app/pdb/path-cmds.c:362
msgid "Close path stroke"
msgstr "Chiudi la delineatura del tracciato"
msgstr "Chiudi delineatura tracciato"
#: ../app/pdb/path-cmds.c:401
msgid "Reverse path stroke"
msgstr "Inverti delineatura del tracciato"
msgstr "Inverti delineatura tracciato"
#: ../app/pdb/path-cmds.c:446
msgid "Translate path stroke"
msgstr "Trasla la delineatura del tracciato"
msgstr "Trasla delineatura tracciato"
#: ../app/pdb/path-cmds.c:491
msgid "Scale path stroke"
msgstr "Scala la delineatura del tracciato"
msgstr "Scala delineatura tracciato"
#: ../app/pdb/path-cmds.c:538
msgid "Rotate path stroke"
msgstr "Ruota la delineatura del tracciato"
msgstr "Ruota delineatura tracciato"
#: ../app/pdb/path-cmds.c:583 ../app/pdb/path-cmds.c:632
msgid "Flip path stroke"
msgstr "Rifletti la delineatura del tracciato"
msgstr "Rifletti delineatura tracciato"
#: ../app/pdb/path-cmds.c:761 ../app/pdb/path-cmds.c:884
#: ../app/pdb/path-cmds.c:1114
msgid "Add path stroke"
msgstr "Aggiungi la delineatura del tracciato"
msgstr "Aggiungi delineatura tracciato"
#: ../app/pdb/path-cmds.c:938 ../app/pdb/path-cmds.c:994
#: ../app/pdb/path-cmds.c:1058
msgid "Extend path stroke"
msgstr "Estendi la delineatura del tracciato"
msgstr "Estendi delineatura tracciato"
#: ../app/pdb/pdb-cmds.c:1185 ../app/pdb/pdb-cmds.c:1227
#, c-format
@@ -24333,7 +24337,7 @@ msgstr "Selezione sconosciuta"
#: ../app/tools/gimpforegroundselecttool.c:667
msgid "press Enter to preview."
msgstr "premere invio l'anteprima."
msgstr "premere invio per l'anteprima."
#: ../app/tools/gimpforegroundselecttool.c:669
msgid "press Escape to exit preview or Enter to apply."
@@ -27751,7 +27755,7 @@ msgstr "Informazioni varie"
msgid "Select fields"
msgstr "Seleziona campi"
#. Tranlators: "N/A" is an abbreviation for "not available"
#. Translators: "N/A" is an abbreviation for "not available"
#: ../app/widgets/gimpdashboard.c:3323
msgctxt "dashboard-value"
msgid "N/A"

View File

@@ -20,45 +20,77 @@
############################################
#### Usage ####
if [ "$#" -ne 2 -a "$#" -ne 1 ]; then
echo "Usage: $0 <GIMP_TAG_PREV> <GIMP_TAG_CUR>"
echo
echo " GIMP_TAG_PREV: last tag release or commit (non-included in stats)"
echo " ex: GIMP_2_9_6"
echo " GIMP_TAG_CUR: current tag release or commit (included in stats); ex: GIMP_2_9_8"
echo " ex: GIMP_2_9_8."
echo " Optional. If absent, statistics up to HEAD."
exit 1
fi
printf "GIMP version to release: "; read ver
PREV=$1
git --no-pager show $PREV >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "First tag is unknown: $PREV"
exit 2
fi
if [ -z "$ver" ]; then
TAG="HEAD"
PREV_TAG=$(git ls-remote --tags --exit-code --refs "https://gitlab.gnome.org/GNOME/gimp.git" |grep -o "GIMP_[0-9]*_[0-9]*_[0-9]*" | sort --version-sort | tail -1)
INTERMEDIATE_TAG=$PREV_TAG
if [ "$#" = 2 ]; then
CUR=$2
git --no-pager show $CUR >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Second tag is unknown: $CUR"
exit 2
fi
is_dev_release=1
else
CUR='HEAD'
major=$(echo "$ver" | cut -d'.' -f1)
minor=$(echo "$ver" | cut -d'.' -f2)
micro=$(echo "$ver" | cut -d'.' -f3)
TAG=GIMP_${major}_${minor}_${micro}
git --no-pager show $TAG >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Tag is unknown: $TAG"
exit 1
fi
is_dev_release=$((minor % 2))
if [ $((micro % 2)) -ne 0 ]; then
echo "Releases must have an even micro version."
exit 1
fi
# The previous tag will be in the same branch. For instance 3.0.4 is
# previous to 3.0.6 even if we may have released 3.1 versions
# in-between.
PREV_TAG=$(git ls-remote --tags --exit-code --refs "https://gitlab.gnome.org/GNOME/gimp.git" |grep -o "GIMP_[0-9]*_[0-9]*_[0-9]*" | sort --version-sort | grep -B1 $TAG | head -1)
# The intermediate tag is the actual version we released before.
INTERMEDIATE_TAG=$(git ls-remote --tags --sort=taggerdate --exit-code --refs "https://gitlab.gnome.org/GNOME/gimp.git" |grep -o "GIMP_[0-9]*_[0-9]*_[0-9]*" | grep -B1 $TAG | head -1)
fi
prev_date=`git log -1 --format=%ci $PREV`
cur_date=`git log -1 --format=%ci $CUR`
#if [ $is_dev_release -eq 0 ]; then
#read -p "Previous stable GIMP version:" ver
#elif [ $micro -eq 0 ];
#else
#read -p "Previous GIMP version:" ver
#fi
prevmajor=$(echo "$1" | cut -d'_' -f2)
prevminor=$(echo "$1" | cut -d'_' -f3)
prevmicro=$(echo "$1" | cut -d'_' -f4)
prevmajor=$(echo "$PREV_TAG" | cut -d'_' -f2)
prevminor=$(echo "$PREV_TAG" | cut -d'_' -f3)
prevmicro=$(echo "$PREV_TAG" | cut -d'_' -f4)
major=$(echo "$2" | cut -d'_' -f2)
minor=$(echo "$2" | cut -d'_' -f3)
micro=$(echo "$2" | cut -d'_' -f4)
intmajor=$(echo "$INTERMEDIATE_TAG" | cut -d'_' -f2)
intminor=$(echo "$INTERMEDIATE_TAG" | cut -d'_' -f3)
intmicro=$(echo "$INTERMEDIATE_TAG" | cut -d'_' -f4)
echo "Previous Release: $prevmajor.$prevminor.$prevmicro"
if [ "$PREV_TAG" != "$INTERMEDIATE_TAG" ]; then
echo "Intermediate Release: $intmajor.$intminor.$intmicro"
fi
#if [ $((prevmicro % 2)) -ne 0 ]; then
#echo "Releases must have an even micro version."
#exit 1
#fi
#if [ $is_dev_release -eq 0 ]; then
#if [ $((prevminor % 2)) -ne 0 ]; then
#echo "$ver is not a stable version."
#exit 1
#fi
#fi
prev_date=`git log -1 --format=%ci $PREV_TAG`
int_date=`git log -1 --format=%ci $INTERMEDIATE_TAG`
cur_date=`git log -1 --format=%ci $TAG`
get_issues_mrs()
{
@@ -116,7 +148,7 @@ count_contributors()
folders=$1
text=$2
contributors=`git --no-pager shortlog -sn $PREV..$CUR -- $folders`
contributors=`git --no-pager shortlog -sn $PREV_TAG..$TAG -- $folders`
if [ -n "$contributors" ]; then
contributors=`echo "$contributors" | cut -f2`
n_contributors=`echo "$contributors" | wc -l`
@@ -152,11 +184,16 @@ count_repo_contributors()
text=$3
prev_tag=$4
cur_tag=$5
since_date=$6
cd $repo
git fetch origin > /dev/null 2>&1
if [ -z "$cur_tag" ]; then
contributors=`git --no-pager shortlog -sn --since="$prev_date" --until="$cur_date" origin/$branch`
if [ -z "$since_date" ]; then
contributors=`git --no-pager shortlog -sn --since="$prev_date" --until="$cur_date" origin/$branch`
else
contributors=`git --no-pager shortlog -sn --since="$since_date" --until="$cur_date" origin/$branch`
fi
else
contributors=`git --no-pager shortlog -sn $prev_tag..$cur_tag`
fi
@@ -177,15 +214,20 @@ count_repo_contributors()
cd - > /dev/null
}
echo "Copy the below text into your release news:"
echo
echo "-------------------------------------------"
echo
echo "Since [GIMP $prevmajor.$prevminor.$prevmicro](/release/$prevmajor.$prevminor.$prevmicro/), in the main GIMP repository:"
echo
echo "* $closed_issues reports were closed as FIXED."
echo "* $merged_mrs merge requests were merged."
# Main stats:
contribs=`git --no-pager shortlog -s -n $PREV..$CUR`
contribs=`git --no-pager shortlog -s -n $PREV_TAG..$TAG`
contribs_n=`printf "$contribs" | wc -l`
commits_n=`git log --oneline $PREV..$CUR | wc -l`
commits_n=`git log --oneline $PREV_TAG..$TAG | wc -l`
echo "* $commits_n commits were pushed."
@@ -195,16 +237,16 @@ echo "* $commits_n commits were pushed."
#commits_rate=$(( $commits_n / $days_n ))
#echo "Start date: $prev_date - End date: $cur_date"
#echo "Between $PREV and $CUR, $contribs_n people contributed $commits_n commits to GIMP."
#echo "Between $PREV_TAG and $TAG, $contribs_n people contributed $commits_n commits to GIMP."
#echo "This is an average of $commits_rate commits a day."
#echo
#echo "Statistics on all files:" `git diff --shortstat $PREV..$CUR 2>/dev/null`
#echo "Statistics on all files:" `git diff --shortstat $PREV_TAG..$TAG 2>/dev/null`
#echo
#echo "Total contributor list:"
#printf "$contribs"
# Translation stats:
i18n=`git --no-pager log --stat $PREV..$CUR -- po* | grep "Updated\? .* \(translation\|language\)"`
i18n=`git --no-pager log --stat $PREV_TAG..$TAG -- po* | grep "Updated\? .* \(translation\|language\)"`
i18n=`printf "$i18n" | sed "s/ *Updated\? \(.*\) \(translation\|language\).*/\\1/" | sort | uniq`
i18n_n=`printf "$i18n" | wc -l`
# It seems that if the last line has no newline, wc does not count it.
@@ -214,7 +256,7 @@ i18n_comma=`printf "$i18n" | paste -s -d, | sed 's/,/, /g'`
echo "* $i18n_n translations were updated: $i18n_comma."
#echo "Statistics on C files:" `git diff --shortstat $PREV..$CUR -- "*.[ch]" 2>/dev/null`
#echo "Statistics on C files:" `git diff --shortstat $PREV_TAG..$TAG -- "*.[ch]" 2>/dev/null`
echo
echo "$contribs_n people contributed changes or fixes to GIMP $major.$minor.$micro codebase (order
@@ -229,7 +271,7 @@ count_contributors 'themes/*/*.css themes/*/*png' "%d theme designers: %s"
meson_builds=`find . -name meson.build -not -path gimp-data`
count_contributors "meson_options.txt $meson_builds .gitlab-ci.yml build" "%d build, packaging or CI contributors: %s"
count_contributors 'data/ etc/ desktop/ menus/ docs/ devel-docs/ NEWS INSTALL.in' "%d contributors on other types of resources: %s"
count_repo_contributors "gimp-data" main "The gimp-data submodule had %d commits by %d contributors: %s"
count_repo_contributors "gimp-data" main "The gimp-data submodule had %d commits by %d contributors: %s" "" "" $int_date
count_data_contributors 'images' "%d image creators: %s"
count_data_contributors 'icons/*.svg icons/*.png' "%d icon designers: %s"
count_data_contributors 'cursors' "%d cursor designers: %s"
@@ -251,23 +293,23 @@ echo "number of commits):"
echo
echo "* Our UX tracker had $ux_closed_issues reports closed as FIXED."
babl_ver=`get_latest_from_meson babl $CUR`
prev_babl_ver=`get_latest_from_meson babl $PREV`
babl_ver=`get_latest_from_meson babl $TAG`
prev_babl_ver=`get_latest_from_meson babl $PREV_TAG`
if [ "$babl_ver" != "$prev_babl_ver" ]; then
prev_tag=`get_tag_from_version BABL $prev_babl_ver`
cur_tag=`get_tag_from_version BABL $babl_ver`
count_repo_contributors "../babl" master "babl $babl_ver is made of %d commits by %d contributors: %s" $prev_tag $cur_tag
fi
gegl_ver=`get_latest_from_meson gegl $CUR`
prev_gegl_ver=`get_latest_from_meson gegl $PREV`
gegl_ver=`get_latest_from_meson gegl $TAG`
prev_gegl_ver=`get_latest_from_meson gegl $PREV_TAG`
if [ "$gegl_ver" != "$prev_gegl_ver" ]; then
prev_tag=`get_tag_from_version GEGL $prev_gegl_ver`
cur_tag=`get_tag_from_version GEGL $gegl_ver`
count_repo_contributors "../gegl" master "GEGL $gegl_ver is made of %d commits by %d contributors: %s" $prev_tag $cur_tag
fi
count_repo_contributors "../ctx.graphics" dev "[ctx](https://ctx.graphics/) had %d commits since $prevmajor.$prevminor.$prevmicro release by %d contributors: %s"
count_repo_contributors "../ctx.graphics" dev "[ctx](https://ctx.graphics/) had %d commits since $intmajor.$intminor.$intmicro release by %d contributors: %s"
count_repo_contributors "../gimp-test-images" main "The \`gimp-test-images\` (unit testing repository) repository had %d commits by %d contributors: %s"
count_repo_contributors "../gimp-macos-build" master "The \`gimp-macos-build\` (macOS packaging scripts) release had %d commits by %d contributors: %s"
# TODO: