Skip to content
Commits on Source (34)
include: 'https://gitlab.gnome.org/GNOME/citemplates/raw/HEAD/flatpak/flatpak_ci_initiative.yml'
stages:
- build
- deploy
cache:
paths:
- _ccache/
variables:
MESON_TEST_TIMEOUT_MULTIPLIER: 2
G_MESSAGES_DEBUG: all
MESON_COMMON_OPTIONS: "--buildtype debug --wrap-mode=nodownload --prefix /usr"
BUNDLE: "gnome-software-dev.flatpak"
.build:
before_script:
- cp -r $HOME/subprojects/* subprojects/
fedora-x86_64:
extends: .build
image: registry.gitlab.gnome.org/gnome/gnome-software/fedora:v6
stage: build
except:
- tags
script:
- meson ${MESON_COMMON_OPTIONS}
-Drpm_ostree=true
-Dmalcontent=true
-Dsysprof=enabled
_build
- ninja -C _build
- .gitlab-ci/run-tests.sh
--no-suite packagekit
--no-suite fwupd
--no-suite libglib-testing
--no-suite malcontent
artifacts:
reports:
junit: "_build/${CI_JOB_NAME}-report.xml"
name: "gnome-software-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
when: always
paths:
- "_build/config.h"
- "_build/meson-logs"
- "_build/${CI_JOB_NAME}-report.xml"
debian-stable-x86_64:
extends: .build
image: registry.gitlab.gnome.org/gnome/gnome-software/debian-stable:v6
stage: build
except:
- tags
script:
- meson ${MESON_COMMON_OPTIONS}
-Drpm_ostree=false
-Dmalcontent=false
-Dsysprof=disabled
_build
- ninja -C _build
- .gitlab-ci/run-tests.sh
--no-suite packagekit
--no-suite fwupd
--no-suite fedora-langpacks
--no-suite libxmlb
artifacts:
reports:
junit: "_build/${CI_JOB_NAME}-report.xml"
name: "gnome-software-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
when: always
paths:
- "_build/config.h"
- "_build/meson-logs"
- "_build/${CI_JOB_NAME}-report.xml"
# Allow building a flatpak on demand to test out the gnome-software UI
flatpak bundle:
extends: '.flatpak'
stage: 'build'
dependencies: []
variables:
MANIFEST_PATH: "contrib/org.gnome.SoftwareDevel.json"
FLATPAK_MODULE: "gnome-software"
RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
APP_ID: "org.gnome.SoftwareDevel"
when: manual
allow_failure: true
script:
# Modified from https://gitlab.gnome.org/GNOME/citemplates/-/blob/HEAD/flatpak/flatpak_ci_initiative.yml
# to drop the unit tests, since we don’t need them
- rewrite-flatpak-manifest ${MANIFEST_PATH} ${FLATPAK_MODULE} ${CONFIG_OPTS}
- flatpak-builder --user --disable-rofiles-fuse flatpak_app --repo=repo ${BRANCH:+--default-branch=$BRANCH} ${MANIFEST_PATH}
# Generate a Flatpak bundle
- flatpak build-bundle repo ${BUNDLE} --runtime-repo=${RUNTIME_REPO} ${APP_ID} ${BRANCH}
- tar cf repo.tar repo/
# Due to the `only` clause in .publish_nightly, this will only publish on-demand
# builds to nightly.gnome.org if they are built from a commit on `main`
nightly:
extends: '.publish_nightly'
dependencies:
- 'flatpak bundle'
needs: ['flatpak bundle']
when: manual
# CI support stuff
## Docker image
GitLab CI jobs run in a Docker image, defined here. To update that image
(perhaps to install some more packages):
1. Edit `.gitlab-ci/Dockerfile` with the changes you want
1. Run `.gitlab-ci/run-docker.sh build --base=debian-stable --base-version=1` to
build the new image (bump the version from the latest listed for that `base`
on https://gitlab.gnome.org/GNOME/gnome-software/container_registry)
1. Run `.gitlab-ci/run-docker.sh push --base=debian-stable --base-version=1` to
upload the new image to the GNOME GitLab Docker registry
* If this is the first time you're doing this, you'll need to log into the
registry
* If you use 2-factor authentication on your GNOME GitLab account, you'll
need to [create a personal access token][pat] and use that rather than
your normal password
1. Edit `.gitlab-ci.yml` (in the root of this repository) to use your new
image
[pat]: https://gitlab.gnome.org/profile/personal_access_tokens
#!/bin/bash
set -e
git clone --depth 1 --no-tags https://gitlab.gnome.org/GNOME/gnome-software.git
meson subprojects download --sourcedir gnome-software
rm gnome-software/subprojects/*.wrap
mv gnome-software/subprojects/ .
rm -rf gnome-software
FROM debian:buster
RUN apt-get update -qq && apt-get install --no-install-recommends -qq -y \
appstream \
clang \
clang-tools-7 \
dbus \
desktop-file-utils \
docbook-xsl \
gcc \
g++ \
gettext \
git \
gnome-pkg-tools \
gobject-introspection \
gperf \
gsettings-desktop-schemas-dev \
gtk-doc-tools \
itstool \
lcov \
libaccountsservice-dev \
libappstream-dev \
libappstream-glib-dev \
libcurl4-openssl-dev \
libflatpak-dev \
libfwupd-dev \
libgirepository1.0-dev \
libglib2.0-dev \
libgoa-1.0-dev \
libgspell-1-dev \
libgtk-3-dev \
libgudev-1.0-dev \
libjson-glib-dev \
liblmdb-dev \
libpackagekit-glib2-dev \
libpam0g-dev \
libpolkit-gobject-1-dev \
libsoup2.4-dev \
libstemmer-dev \
libxmlb-dev \
libxml2-utils \
libyaml-dev \
ninja-build \
packagekit \
pkg-config \
policykit-1 \
python3 \
python3-pip \
python3-setuptools \
python3-wheel \
shared-mime-info \
sudo \
unzip \
valgrind \
wget \
xsltproc \
xz-utils \
&& rm -rf /usr/share/doc/* /usr/share/man/*
RUN pip3 install meson==0.50.0
# Enable passwordless sudo for sudo users
RUN sed -i -e '/%sudo/s/ALL$/NOPASSWD: ALL/' /etc/sudoers
ARG HOST_USER_ID=5555
ENV HOST_USER_ID ${HOST_USER_ID}
RUN useradd -u $HOST_USER_ID -G sudo -ms /bin/bash user
USER user
WORKDIR /home/user
COPY cache-subprojects.sh .
RUN ./cache-subprojects.sh
ENV LANG=C.UTF-8 LANGUAGE=C.UTF-8 LC_ALL=C.UTF-8
FROM fedora:31
RUN dnf -y install \
appstream \
accountsservice-devel \
clang \
clang-analyzer \
dbus-daemon \
dbus-devel \
desktop-file-utils \
docbook-style-xsl \
flatpak-devel \
fwupd-devel \
gcc \
gettext \
git \
glib2-devel \
gobject-introspection \
gobject-introspection-devel \
gperf \
gsettings-desktop-schemas-devel \
gspell-devel \
gtk-doc \
gtk3-devel \
json-glib-devel \
itstool \
lcov \
libappstream-glib-devel \
lmdb-devel \
appstream-devel \
libcurl-devel \
libdnf-devel \
libgudev-devel \
liboauth-devel \
libsecret-devel \
libsoup-devel \
libstemmer-devel \
libxmlb-devel \
libxslt \
libyaml-devel \
NetworkManager-libnm-devel \
ninja-build \
ostree-devel \
PackageKit \
PackageKit-glib-devel \
pam-devel \
pcre-devel \
polkit-devel \
python3 \
python3-pip \
python3-wheel \
rpm-devel \
rpm-ostree-devel \
shared-mime-info \
snapd-glib-devel \
unzip \
valgrind \
valgrind-devel \
wget \
xz \
zlib-devel \
&& dnf clean all
RUN pip3 install meson==0.50.0
# Enable sudo for wheel users
RUN sed -i -e 's/# %wheel/%wheel/' -e '0,/%wheel/{s/%wheel/# %wheel/}' /etc/sudoers
ARG HOST_USER_ID=5555
ENV HOST_USER_ID ${HOST_USER_ID}
RUN useradd -u $HOST_USER_ID -G wheel -ms /bin/bash user
USER user
WORKDIR /home/user
COPY cache-subprojects.sh .
RUN ./cache-subprojects.sh
ENV LANG C.UTF-8
#!/usr/bin/env python3
# Turns a Meson testlog.json file into a JUnit XML report
#
# Copyright 2019 GNOME Foundation
#
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# Original author: Emmanuele Bassi
import argparse
import datetime
import json
import os
import sys
import xml.etree.ElementTree as ET
aparser = argparse.ArgumentParser(description='Turns a Meson test log into a JUnit report')
aparser.add_argument('--project-name', metavar='NAME',
help='The project name',
default='unknown')
aparser.add_argument('--job-id', metavar='ID',
help='The job ID for the report',
default='Unknown')
aparser.add_argument('--branch', metavar='NAME',
help='Branch of the project being tested',
default='main')
aparser.add_argument('--output', metavar='FILE',
help='The output file, stdout by default',
type=argparse.FileType('w', encoding='UTF-8'),
default=sys.stdout)
aparser.add_argument('infile', metavar='FILE',
help='The input testlog.json, stdin by default',
type=argparse.FileType('r', encoding='UTF-8'),
default=sys.stdin)
args = aparser.parse_args()
outfile = args.output
testsuites = ET.Element('testsuites')
testsuites.set('id', '{}/{}'.format(args.job_id, args.branch))
testsuites.set('package', args.project_name)
testsuites.set('timestamp', datetime.datetime.utcnow().isoformat())
suites = {}
for line in args.infile:
data = json.loads(line)
(full_suite, unit_name) = data['name'].split(' / ')
try:
(project_name, suite_name) = full_suite.split(':')
except ValueError:
(project_name, suite_name) = (args.project_name, full_suite)
duration = data['duration']
return_code = data['returncode']
log = data['stdout']
log_stderr = data.get('stderr', '')
unit = {
'suite': suite_name,
'name': unit_name,
'duration': duration,
'returncode': return_code,
'stdout': log,
'stderr': log_stderr,
}
units = suites.setdefault(suite_name, [])
units.append(unit)
for name, units in suites.items():
print('Processing suite {} (units: {})'.format(name, len(units)))
def if_failed(unit):
if unit['returncode'] != 0:
return True
return False
def if_succeded(unit):
if unit['returncode'] == 0:
return True
return False
successes = list(filter(if_succeded, units))
failures = list(filter(if_failed, units))
print(' - {}: {} pass, {} fail'.format(name, len(successes), len(failures)))
testsuite = ET.SubElement(testsuites, 'testsuite')
testsuite.set('name', '{}/{}'.format(args.project_name, name))
testsuite.set('tests', str(len(units)))
testsuite.set('errors', str(len(failures)))
testsuite.set('failures', str(len(failures)))
for unit in successes:
testcase = ET.SubElement(testsuite, 'testcase')
testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
testcase.set('name', unit['name'])
testcase.set('time', str(unit['duration']))
for unit in failures:
testcase = ET.SubElement(testsuite, 'testcase')
testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
testcase.set('name', unit['name'])
testcase.set('time', str(unit['duration']))
failure = ET.SubElement(testcase, 'failure')
failure.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
failure.set('name', unit['name'])
failure.set('type', 'error')
failure.text = unit['stdout'] + '\n' + unit['stderr']
output = ET.tostring(testsuites, encoding='unicode')
outfile.write(output)
#!/bin/bash
read_arg() {
# $1 = arg name
# $2 = arg value
# $3 = arg parameter
local rematch='^[^=]*=(.*)$'
if [[ $2 =~ $rematch ]]; then
read -r "$1" <<< "${BASH_REMATCH[1]}"
else
read -r "$1" <<< "$3"
# There is no way to shift our callers args, so
# return 1 to indicate they should do it instead.
return 1
fi
}
SUDO_CMD="sudo"
if docker -v |& grep -q podman; then
# Using podman
SUDO_CMD=""
# Docker is actually implemented by podman, and its OCI output
# is incompatible with some of the dockerd instances on GitLab
# CI runners.
export BUILDAH_FORMAT=docker
fi
set -e
base=""
base_version=""
build=0
run=0
push=0
list=0
print_help=0
no_login=0
while (($# > 0)); do
case "${1%%=*}" in
build) build=1;;
run) run=1;;
push) push=1;;
list) list=1;;
help) print_help=1;;
--base|-b) read_arg base "$@" || shift;;
--base-version) read_arg base_version "$@" || shift;;
--no-login) no_login=1;;
*) echo -e "\e[1;31mERROR\e[0m: Unknown option '$1'"; exit 1;;
esac
shift
done
if [ $print_help == 1 ]; then
echo "$0 - Build and run Docker images"
echo ""
echo "Usage: $0 <command> [options] [basename]"
echo ""
echo "Available commands"
echo ""
echo " build --base=<BASENAME> - Build Docker image <BASENAME>.Dockerfile"
echo " run --base=<BASENAME> - Run Docker image <BASENAME>"
echo " push --base=<BASENAME> - Push Docker image <BASENAME> to the registry"
echo " list - List available images"
echo " help - This help message"
echo ""
exit 0
fi
cd "$(dirname "$0")"
if [ $list == 1 ]; then
echo "Available Docker images:"
for f in *.Dockerfile; do
filename=$( basename -- "$f" )
basename="${filename%.*}"
echo -e " \e[1;39m$basename\e[0m"
done
exit 0
fi
# All commands after this require --base to be set
if [ -z "${base}" ]; then
echo "Usage: $0 <command>"
exit 1
fi
if [ ! -f "$base.Dockerfile" ]; then
echo -e "\e[1;31mERROR\e[0m: Dockerfile for '$base' not found"
exit 1
fi
if [ -z "${base_version}" ]; then
base_version="latest"
else
base_version="v$base_version"
fi
TAG="registry.gitlab.gnome.org/gnome/gnome-software/${base}:${base_version}"
if [ $build == 1 ]; then
echo -e "\e[1;32mBUILDING\e[0m: ${base} as ${TAG}"
$SUDO_CMD docker build \
--build-arg HOST_USER_ID="$UID" \
--tag "${TAG}" \
--file "${base}.Dockerfile" .
exit $?
fi
if [ $push == 1 ]; then
echo -e "\e[1;32mPUSHING\e[0m: ${base} as ${TAG}"
if [ $no_login == 0 ]; then
$SUDO_CMD docker login registry.gitlab.gnome.org
fi
$SUDO_CMD docker push $TAG
exit $?
fi
if [ $run == 1 ]; then
echo -e "\e[1;32mRUNNING\e[0m: ${base} as ${TAG}"
$SUDO_CMD docker run \
--rm \
--volume "$(pwd)/..:/home/user/app" \
--workdir "/home/user/app" \
--tty \
--interactive "${TAG}" \
bash
exit $?
fi
#!/bin/bash
set +e
case "$1" in
--log-file)
log_file="$2"
shift
shift
;;
*)
log_file="_build/meson-logs/testlog.json"
esac
# FIXME: The tests should be isolated and use mock services so they do not
# require a functioning system bus. This will have to do for now though.
sudo mkdir -p /run/dbus
sudo mkdir -p /var
sudo ln -s /var/run /run
sudo dbus-daemon --system --fork
sudo /usr/lib/polkit-1/polkitd --no-debug &
sudo /usr/libexec/fwupd/fwupd --verbose &
# FIXME: Running the flatpak tests as root means the system helper doesn’t
# need to be used, which makes them run a lot faster.
sudo \
meson test \
-C _build \
--timeout-multiplier ${MESON_TEST_TIMEOUT_MULTIPLIER} \
--no-suite flaky \
--print-errorlogs \
"$@"
exit_code=$?
python3 .gitlab-ci/meson-junit-report.py \
--project-name=gnome-software \
--job-id "${CI_JOB_NAME}" \
--output "_build/${CI_JOB_NAME}-report.xml" \
"${log_file}"
exit $exit_code
Version 41.2
~~~~~~~~~~~~
Released: 2021-12-03
This is a stable release with the following changes:
* Fix a crash when processing age ratings
* Reload application details only when not installing/removing the application
* Do not follow symlinks when calculating disk size usage
* Fix addons section, which could show addons for different application
This release also updates translations:
* Bulgarian
* Catalan
* Croatian
* English (United Kingdom)
* German
* Latvian
* Occitan (post 1500)
Version 41.1
~~~~~~~~~~~~
Released: 2021-10-28
......
......@@ -66,6 +66,29 @@
Validate with `appstreamcli validate *.appdata.xml`
-->
<releases>
<release date="2021-12-03" version="41.2" type="stable">
<description>
<p>
This is a stable release with the following changes:
</p>
<ul>
<li>Fix a crash when processing age ratings</li>
<li>Reload application details only when not installing/removing the application</li>
<li>Do not follow symlinks when calculating disk size usage</li>
<li>Fix addons section, which could show addons for different application</li>
</ul>
<p>This release also updates translations:</p>
<ul>
<li>Bulgarian</li>
<li>Catalan</li>
<li>Croatian</li>
<li>English (United Kingdom)</li>
<li>German</li>
<li>Latvian</li>
<li>Occitan (post 1500)</li>
</ul>
</description>
</release>
<release date="2021-10-28" version="41.1" type="stable">
<description>
<p>
......
......@@ -15,4 +15,5 @@ executable(
c_args : ['-DG_LOG_DOMAIN="GsInstallAppstream"'],
install : true,
install_dir : get_option('libexecdir'),
install_rpath : gs_private_libdir,
)
......@@ -336,14 +336,15 @@ gs_app_list_check_for_duplicate (GsAppList *list, GsApp *app)
return TRUE;
}
for (guint i = 0; i < list->array->len; i++) {
GsApp *app_tmp = g_ptr_array_index (list->array, i);
if (app_tmp == app)
return FALSE;
}
/* does not exist */
id = gs_app_get_unique_id (app);
if (id == NULL) {
for (guint i = 0; i < list->array->len; i++) {
GsApp *app_tmp = g_ptr_array_index (list->array, i);
if (app_tmp == app)
return FALSE;
}
/* not much else we can do... */
return TRUE;
}
......@@ -851,8 +852,11 @@ gs_app_list_filter_duplicates (GsAppList *list, GsAppListFilterFlags flags)
/* add back the apps we want to keep */
for (guint i = 0; i < old->array->len; i++) {
GsApp *app = gs_app_list_index (old, i);
if (g_hash_table_contains (kept_apps, app))
if (g_hash_table_contains (kept_apps, app)) {
gs_app_list_add_safe (list, app, GS_APP_LIST_ADD_FLAG_NONE);
/* In case the same instance is in the 'list' multiple times */
g_hash_table_remove (kept_apps, app);
}
}
}
......
......@@ -2114,21 +2114,23 @@ gs_app_set_local_file (GsApp *app, GFile *local_file)
}
/**
* gs_app_get_content_rating:
* gs_app_dup_content_rating:
* @app: a #GsApp
*
* Gets the content rating for this application.
*
* Returns: (transfer none): a #AsContentRating, or %NULL
* Returns: (transfer full) (nullable): a #AsContentRating, or %NULL
*
* Since: 40
* Since: 41
**/
AsContentRating *
gs_app_get_content_rating (GsApp *app)
gs_app_dup_content_rating (GsApp *app)
{
GsAppPrivate *priv = gs_app_get_instance_private (app);
g_autoptr(GMutexLocker) locker = NULL;
g_return_val_if_fail (GS_IS_APP (app), NULL);
return priv->content_rating;
locker = g_mutex_locker_new (&priv->mutex);
return (priv->content_rating != NULL) ? g_object_ref (priv->content_rating) : NULL;
}
/**
......
......@@ -371,7 +371,7 @@ void gs_app_remove_all_icons (GsApp *app);
GFile *gs_app_get_local_file (GsApp *app);
void gs_app_set_local_file (GsApp *app,
GFile *local_file);
AsContentRating *gs_app_get_content_rating (GsApp *app);
AsContentRating *gs_app_dup_content_rating (GsApp *app);
void gs_app_set_content_rating (GsApp *app,
AsContentRating *content_rating);
GsApp *gs_app_get_runtime (GsApp *app);
......
......@@ -1490,12 +1490,14 @@ gs_utils_get_file_size (const gchar *filename,
if (g_stat (full_path, &st) == 0 && (include_func == NULL ||
include_func (full_path + base_len,
S_ISLNK (st.st_mode) ? G_FILE_TEST_IS_SYMLINK :
g_file_test (full_path, G_FILE_TEST_IS_SYMLINK) ? G_FILE_TEST_IS_SYMLINK :
S_ISDIR (st.st_mode) ? G_FILE_TEST_IS_DIR :
G_FILE_TEST_IS_REGULAR,
user_data))) {
if (S_ISDIR (st.st_mode)) {
dirs_to_do = g_slist_prepend (dirs_to_do, g_steal_pointer (&full_path));
/* Skip symlinks, they can point to a shared storage */
if (!g_file_test (full_path, G_FILE_TEST_IS_SYMLINK))
dirs_to_do = g_slist_prepend (dirs_to_do, g_steal_pointer (&full_path));
} else {
size += st.st_size;
}
......
project('gnome-software', 'c',
version : '41.1',
version : '41.2',
license : 'GPL-2.0+',
default_options : ['warning_level=1', 'c_std=c11'],
meson_version : '>=0.47.0'
......
......@@ -97,7 +97,7 @@ app_is_expected_to_have_content_rating (GsApp *app)
static gboolean
app_is_content_rating_appropriate (GsApp *app, MctAppFilter *app_filter)
{
AsContentRating *rating = gs_app_get_content_rating (app); /* (nullable) */
g_autoptr(AsContentRating) rating = gs_app_dup_content_rating (app); /* (nullable) */
g_autofree const gchar **oars_sections = mct_app_filter_get_oars_sections (app_filter);
AsContentRatingValue default_rating_value;
......
......@@ -326,22 +326,24 @@ snap_guess_component_kind (SnapdSnap *snap)
}
static GsApp *
snap_to_app (GsPlugin *plugin, SnapdSnap *snap)
snap_to_app (GsPlugin *plugin, SnapdSnap *snap, const gchar *branch)
{
g_autofree gchar *appstream_id = NULL;
g_autofree gchar *unique_id = NULL;
g_autofree gchar *cache_id = NULL;
g_autoptr(GsApp) app = NULL;
appstream_id = get_appstream_id (snap);
unique_id = g_strdup_printf ("system/snap/*/%s/*", appstream_id);
cache_id = g_strdup_printf ("%s:%s", snapd_snap_get_name (snap), branch != NULL ? branch : "");
app = gs_plugin_cache_lookup (plugin, unique_id);
app = gs_plugin_cache_lookup (plugin, cache_id);
if (app == NULL) {
g_autofree gchar *appstream_id = NULL;
appstream_id = get_appstream_id (snap);
app = gs_app_new (appstream_id);
gs_app_set_from_unique_id (app, unique_id, snap_guess_component_kind (snap));
gs_app_set_kind (app, snap_guess_component_kind (snap));
gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_SNAP);
gs_app_set_branch (app, branch);
gs_app_set_metadata (app, "snap::name", snapd_snap_get_name (snap));
gs_plugin_cache_add (plugin, unique_id, app);
gs_plugin_cache_add (plugin, cache_id, app);
}
gs_app_set_management_plugin (app, "snap");
......@@ -383,7 +385,7 @@ gs_plugin_url_to_app (GsPlugin *plugin,
if (snaps == NULL || snaps->len < 1)
return TRUE;
app = snap_to_app (plugin, g_ptr_array_index (snaps, 0));
app = snap_to_app (plugin, g_ptr_array_index (snaps, 0), NULL);
gs_app_list_add (list, app);
return TRUE;
......@@ -435,7 +437,7 @@ gs_plugin_add_popular (GsPlugin *plugin,
return FALSE;
for (i = 0; i < snaps->len; i++) {
g_autoptr(GsApp) app = snap_to_app (plugin, g_ptr_array_index (snaps, i));
g_autoptr(GsApp) app = snap_to_app (plugin, g_ptr_array_index (snaps, i), NULL);
gs_app_list_add (list, app);
}
......@@ -497,7 +499,7 @@ gs_plugin_add_category_apps (GsPlugin *plugin,
if (snaps == NULL)
return FALSE;
for (j = 0; j < snaps->len; j++) {
g_autoptr(GsApp) app = snap_to_app (plugin, g_ptr_array_index (snaps, j));
g_autoptr(GsApp) app = snap_to_app (plugin, g_ptr_array_index (snaps, j), NULL);
gs_app_list_add (list, app);
}
}
......@@ -529,7 +531,7 @@ gs_plugin_add_installed (GsPlugin *plugin,
SnapdSnap *snap = g_ptr_array_index (snaps, i);
g_autoptr(GsApp) app = NULL;
app = snap_to_app (plugin, snap);
app = snap_to_app (plugin, snap, NULL);
gs_app_list_add (list, app);
}
......@@ -553,7 +555,7 @@ gs_plugin_add_search (GsPlugin *plugin,
return FALSE;
for (i = 0; i < snaps->len; i++) {
g_autoptr(GsApp) app = snap_to_app (plugin, g_ptr_array_index (snaps, i));
g_autoptr(GsApp) app = snap_to_app (plugin, g_ptr_array_index (snaps, i), NULL);
gs_app_list_add (list, app);
}
......@@ -666,9 +668,8 @@ add_channels (GsPlugin *plugin, SnapdSnap *snap, GsAppList *list)
g_autoptr(GsApp) app = NULL;
g_autofree gchar *expanded_name = NULL;
app = snap_to_app (plugin, snap);
expanded_name = expand_channel_name (snapd_channel_get_name (channel));
gs_app_set_branch (app, expanded_name);
app = snap_to_app (plugin, snap, expanded_name);
gs_app_list_add (list, app);
}
......@@ -1402,7 +1403,7 @@ gs_plugin_add_updates (GsPlugin *plugin,
g_autoptr(GsApp) app = NULL;
/* Convert SnapdSnap to a GsApp */
app = snap_to_app (plugin, snap);
app = snap_to_app (plugin, snap, NULL);
/* If for some reason the app is already getting updated, then
* don't change its state */
......
This diff is collapsed.
......@@ -1262,7 +1262,7 @@ msgid ""
msgstr ""
"%s està dissenyat, desenvolupat i traduït per una comunitat internacional de voluntaris.\n"
"\n"
"Això vol dir que encara que no estigui disponible en la vostra llengua, podeu implicar-vos i ajudar a traduir-la vosaltres mateixos."
"Això vol dir que encara que no estigui disponible en la vostra llengua, podeu implicar-vos i ajudar a traduir-lo vosaltres mateixos."
#: src/gs-app-translation-dialog.ui:9
msgid "Translations"
......@@ -2070,7 +2070,7 @@ msgstr ""
#: src/gs-details-page.ui:87
msgid "Help _Translate"
msgstr "_Traduïu l'ajuda"
msgstr "_Ajudeu a traduir-lo"
#. TRANSLATORS: A label for a button to execute the selected application.
#: src/gs-details-page.ui:257
......