aboutsummaryrefslogtreecommitdiffstats
path: root/net-im
diff options
context:
space:
mode:
authorjrm <jrm@FreeBSD.org>2018-02-04 09:01:34 +0800
committerjrm <jrm@FreeBSD.org>2018-02-04 09:01:34 +0800
commite07bf415948eb8ddd37407911577f17a747bc0a2 (patch)
treee09615433a01134db583a35e4739dce102dec384 /net-im
parentb5740494dd2581562e17e13d9cc9b47299bcbd0d (diff)
downloadfreebsd-ports-gnome-e07bf415948eb8ddd37407911577f17a747bc0a2.tar.gz
freebsd-ports-gnome-e07bf415948eb8ddd37407911577f17a747bc0a2.tar.zst
freebsd-ports-gnome-e07bf415948eb8ddd37407911577f17a747bc0a2.zip
net-im/mastodon: fix issue with assets pre-compile
The assets are generated with a random hex string, so patch files to make this part of the build reproducible. Reported by: GĂ©rald Niel
Diffstat (limited to 'net-im')
-rw-r--r--net-im/mastodon/Makefile223
-rw-r--r--net-im/mastodon/files/patch-config_boot.rb11
-rw-r--r--net-im/mastodon/pkg-plist14
3 files changed, 133 insertions, 115 deletions
diff --git a/net-im/mastodon/Makefile b/net-im/mastodon/Makefile
index 87a4dc26e3aa..43ea4e4ec6e5 100644
--- a/net-im/mastodon/Makefile
+++ b/net-im/mastodon/Makefile
@@ -3,6 +3,7 @@
PORTNAME= mastodon
DISTVERSIONPREFIX= v
DISTVERSION= 2.2.0
+PORTREVISION= 1
CATEGORIES= net-im www
MAINTAINER= jrm@FreeBSD.org
@@ -11,82 +12,82 @@ COMMENT= GNU Social-compatible microblogging server
LICENSE= AGPLv3
LICENSE_FILE= ${WRKSRC}/LICENSE
-BUILD_DEPENDS= yarn>:www/yarn \
+BUILD_DEPENDS= yarn>:www/yarn\
${BR_DEPENDS}
LIB_DEPENDS= libidn2.so:dns/libidn2
RUN_DEPENDS= ${BR_DEPENDS}
-BR_DEPENDS= ffmpeg>0:multimedia/ffmpeg \
- libpqtypes>1.5.0:databases/libpqtypes \
- rubygem-pkg-config>=1.2.3:devel/rubygem-pkg-config \
- rubygem-puma>=3.10:www/rubygem-puma \
- rubygem-rails5>=5.1.4:www/rubygem-rails5 \
- rubygem-uglifier>=3.2.0:www/rubygem-uglifier \
- rubygem-hamlit-rails-rails5>=0.2.0:www/rubygem-hamlit-rails-rails5 \
- rubygem-pg>=0.21.0:databases/rubygem-pg \
- rubygem-pghero-rails5>=2.0.0:databases/rubygem-pghero-rails5 \
- rubygem-dotenv-rails-rails5>=2.2:misc/rubygem-dotenv-rails-rails5 \
- rubygem-aws-sdk>=2.10:devel/rubygem-aws-sdk \
- rubygem-fog-core1>=1.45:devel/rubygem-fog-core1 \
- rubygem-fog-local>=0.4:net/rubygem-fog-local \
- rubygem-fog-openstack>=0.1:net/rubygem-fog-openstack \
- rubygem-paperclip-rails5>=5.1.0:devel/rubygem-paperclip-rails5 \
- rubygem-paperclip-av-transcoder>=0.6:multimedia/rubygem-paperclip-av-transcoder \
- rubygem-active_model_serializers>=0.10:databases/rubygem-active_model_serializers \
- rubygem-addressable>=2.5:www/rubygem-addressable \
- rubygem-bootsnap>=0:devel/rubygem-bootsnap \
- rubygem-browser>=2.4.0:www/rubygem-browser \
- rubygem-charlock_holmes>=0.7.5:textproc/rubygem-charlock_holmes \
- rubygem-iso-639>=0.2.8:textproc/rubygem-iso-639 \
- rubygem-cld3>=3.2.0:textproc/rubygem-cld3 \
- rubygem-devise-rails5>=4.4:devel/rubygem-devise-rails5 \
- rubygem-devise-two-factor-rails5>=3.0:security/rubygem-devise-two-factor-rails5 \
- rubygem-doorkeeper-rails5>=4.2:security/rubygem-doorkeeper-rails5 \
- rubygem-fast_blank>=1.0:devel/rubygem-fast_blank \
- rubygem-goldfinger>=2.1:www/rubygem-goldfinger \
- rubygem-hiredis>=0.6:databases/rubygem-hiredis \
- rubygem-redis-namespace>=1.5:databases/rubygem-redis-namespace \
- rubygem-htmlentities>=4.3:textproc/rubygem-htmlentities \
- rubygem-http>=3.0:www/rubygem-http \
- rubygem-http_accept_language>=2.1:devel/rubygem-http_accept_language \
- rubygem-httplog>=0.99:sysutils/rubygem-httplog \
- rubygem-idn-ruby>=0.1.0:dns/rubygem-idn-ruby \
- rubygem-kaminari-rails5>=1.1:www/rubygem-kaminari-rails5 \
- rubygem-link_header>=0.0.8:www/rubygem-link_header \
- rubygem-mime-types>=3.1:misc/rubygem-mime-types \
- rubygem-nokogiri>=1.8:textproc/rubygem-nokogiri \
- rubygem-nsa-rails5>=0.2:devel/rubygem-nsa-rails5 \
- rubygem-oj>=3.3:devel/rubygem-oj \
- rubygem-ostatus2>=2.0:www/rubygem-ostatus2 \
- rubygem-ox>=2.8:textproc/rubygem-ox \
- rubygem-pundit>=1.1:security/rubygem-pundit \
- rubygem-premailer-rails-rails5>=0:mail/rubygem-premailer-rails-rails5 \
- rubygem-rack-attack>=5.0:www/rubygem-rack-attack \
- rubygem-rack-cors0>=0.4:www/rubygem-rack-cors0 \
- rubygem-rack-timeout>=0.4:www/rubygem-rack-timeout \
- rubygem-rails-i18n>=5.0:devel/rubygem-rails-i18n \
- rubygem-rails-settings-cached-rails5>=0.6:www/rubygem-rails-settings-cached-rails5 \
- rubygem-redis>=4.0:databases/rubygem-redis \
- rubygem-mario-redis-lock>=1.2:databases/rubygem-mario-redis-lock \
- rubygem-rqrcode>=0.10:www/rubygem-rqrcode \
- rubygem-ruby-oembed>=0.12:www/rubygem-ruby-oembed \
- rubygem-progressbar>=1.4:devel/rubygem-progressbar \
- rubygem-sanitize>=4.4:textproc/rubygem-sanitize \
- rubygem-sidekiq>=5.0:devel/rubygem-sidekiq \
- rubygem-sidekiq-scheduler>=2.1:devel/rubygem-sidekiq-scheduler \
- rubygem-sidekiq-unique-jobs>=5.0:devel/rubygem-sidekiq-unique-jobs \
- rubygem-sidekiq-bulk-rails5>=0.1.1:devel/rubygem-sidekiq-bulk-rails5 \
- rubygem-simple-navigation>=4.0:devel/rubygem-simple-navigation \
- rubygem-simple_form-rails5>=3.4:devel/rubygem-simple_form-rails5 \
- rubygem-sprockets-rails-rails5>=3.2:devel/rubygem-sprockets-rails-rails5 \
- rubygem-strong_migrations>=0.1.9:devel/rubygem-strong_migrations \
- rubygem-twitter-text1>=1.14:textproc/rubygem-twitter-text1 \
- rubygem-tzinfo-data>=1.2017:devel/rubygem-tzinfo-data \
- rubygem-webpacker-rails5>=3.0:devel/rubygem-webpacker-rails5 \
- rubygem-webpush>=0.3.2_1:security/rubygem-webpush \
- rubygem-json-ld-preloaded>=2.2.1:converters/rubygem-json-ld-preloaded \
- rubygem-rdf-normalize>=0.3.1:www/rubygem-rdf-normalize \
- rubygem-lograge-rails5>=0.7:www/rubygem-lograge-rails5 \
+BR_DEPENDS= ffmpeg>0:multimedia/ffmpeg\
+ libpqtypes>1.5.0:databases/libpqtypes\
+ rubygem-pkg-config>=1.2.3:devel/rubygem-pkg-config\
+ rubygem-puma>=3.10:www/rubygem-puma\
+ rubygem-rails5>=5.1.4:www/rubygem-rails5\
+ rubygem-uglifier>=3.2.0:www/rubygem-uglifier\
+ rubygem-hamlit-rails-rails5>=0.2.0:www/rubygem-hamlit-rails-rails5\
+ rubygem-pg>=0.21.0:databases/rubygem-pg\
+ rubygem-pghero-rails5>=2.0.0:databases/rubygem-pghero-rails5\
+ rubygem-dotenv-rails-rails5>=2.2:misc/rubygem-dotenv-rails-rails5\
+ rubygem-aws-sdk>=2.10:devel/rubygem-aws-sdk\
+ rubygem-fog-core1>=1.45:devel/rubygem-fog-core1\
+ rubygem-fog-local>=0.4:net/rubygem-fog-local\
+ rubygem-fog-openstack>=0.1:net/rubygem-fog-openstack\
+ rubygem-paperclip-rails5>=5.1.0:devel/rubygem-paperclip-rails5\
+ rubygem-paperclip-av-transcoder>=0.6:multimedia/rubygem-paperclip-av-transcoder\
+ rubygem-active_model_serializers>=0.10:databases/rubygem-active_model_serializers\
+ rubygem-addressable>=2.5:www/rubygem-addressable\
+ rubygem-bootsnap>=0:devel/rubygem-bootsnap\
+ rubygem-browser>=2.4.0:www/rubygem-browser\
+ rubygem-charlock_holmes>=0.7.5:textproc/rubygem-charlock_holmes\
+ rubygem-iso-639>=0.2.8:textproc/rubygem-iso-639\
+ rubygem-cld3>=3.2.0:textproc/rubygem-cld3\
+ rubygem-devise-rails5>=4.4:devel/rubygem-devise-rails5\
+ rubygem-devise-two-factor-rails5>=3.0:security/rubygem-devise-two-factor-rails5\
+ rubygem-doorkeeper-rails5>=4.2:security/rubygem-doorkeeper-rails5\
+ rubygem-fast_blank>=1.0:devel/rubygem-fast_blank\
+ rubygem-goldfinger>=2.1:www/rubygem-goldfinger\
+ rubygem-hiredis>=0.6:databases/rubygem-hiredis\
+ rubygem-redis-namespace>=1.5:databases/rubygem-redis-namespace\
+ rubygem-htmlentities>=4.3:textproc/rubygem-htmlentities\
+ rubygem-http>=3.0:www/rubygem-http\
+ rubygem-http_accept_language>=2.1:devel/rubygem-http_accept_language\
+ rubygem-httplog>=0.99:sysutils/rubygem-httplog\
+ rubygem-idn-ruby>=0.1.0:dns/rubygem-idn-ruby\
+ rubygem-kaminari-rails5>=1.1:www/rubygem-kaminari-rails5\
+ rubygem-link_header>=0.0.8:www/rubygem-link_header\
+ rubygem-mime-types>=3.1:misc/rubygem-mime-types\
+ rubygem-nokogiri>=1.8:textproc/rubygem-nokogiri\
+ rubygem-nsa-rails5>=0.2:devel/rubygem-nsa-rails5\
+ rubygem-oj>=3.3:devel/rubygem-oj\
+ rubygem-ostatus2>=2.0:www/rubygem-ostatus2\
+ rubygem-ox>=2.8:textproc/rubygem-ox\
+ rubygem-pundit>=1.1:security/rubygem-pundit\
+ rubygem-premailer-rails-rails5>=0:mail/rubygem-premailer-rails-rails5\
+ rubygem-rack-attack>=5.0:www/rubygem-rack-attack\
+ rubygem-rack-cors0>=0.4:www/rubygem-rack-cors0\
+ rubygem-rack-timeout>=0.4:www/rubygem-rack-timeout\
+ rubygem-rails-i18n>=5.0:devel/rubygem-rails-i18n\
+ rubygem-rails-settings-cached-rails5>=0.6:www/rubygem-rails-settings-cached-rails5\
+ rubygem-redis>=4.0:databases/rubygem-redis\
+ rubygem-mario-redis-lock>=1.2:databases/rubygem-mario-redis-lock\
+ rubygem-rqrcode>=0.10:www/rubygem-rqrcode\
+ rubygem-ruby-oembed>=0.12:www/rubygem-ruby-oembed\
+ rubygem-progressbar>=1.4:devel/rubygem-progressbar\
+ rubygem-sanitize>=4.4:textproc/rubygem-sanitize\
+ rubygem-sidekiq>=5.0:devel/rubygem-sidekiq\
+ rubygem-sidekiq-scheduler>=2.1:devel/rubygem-sidekiq-scheduler\
+ rubygem-sidekiq-unique-jobs>=5.0:devel/rubygem-sidekiq-unique-jobs\
+ rubygem-sidekiq-bulk-rails5>=0.1.1:devel/rubygem-sidekiq-bulk-rails5\
+ rubygem-simple-navigation>=4.0:devel/rubygem-simple-navigation\
+ rubygem-simple_form-rails5>=3.4:devel/rubygem-simple_form-rails5\
+ rubygem-sprockets-rails-rails5>=3.2:devel/rubygem-sprockets-rails-rails5\
+ rubygem-strong_migrations>=0.1.9:devel/rubygem-strong_migrations\
+ rubygem-twitter-text1>=1.14:textproc/rubygem-twitter-text1\
+ rubygem-tzinfo-data>=1.2017:devel/rubygem-tzinfo-data\
+ rubygem-webpacker-rails5>=3.0:devel/rubygem-webpacker-rails5\
+ rubygem-webpush>=0.3.2_1:security/rubygem-webpush\
+ rubygem-json-ld-preloaded>=2.2.1:converters/rubygem-json-ld-preloaded\
+ rubygem-rdf-normalize>=0.3.1:www/rubygem-rdf-normalize\
+ rubygem-lograge-rails5>=0.7:www/rubygem-lograge-rails5\
rubygem-redis-rails-rails5>=5.0.2:www/rubygem-redis-rails-rails5
USES= gmake gnome pgsql python:build,2 shebangfix
@@ -100,18 +101,18 @@ USE_RUBY= yes
NODE_BIN= ${LOCALBASE}/bin/node
NODE_ABI= ${NODE_VER:C/v4.*/46/:C/v6.*/48/:C/v8.*/57/:C/v9.*/59/}
-PLIST_SUB= NODE_ABI=${NODE_ABI}
-
+PLIST_SUB= NODE_ABI=${NODE_ABI}\
+ RUBY_SUFFIX=
SHEBANG_FILES= bin/*
-
USERS= ${PORTNAME}
GROUPS= ${PORTNAME}
-
SUB_LIST+= RAKE="${LOCALBASE}/bin/rake" RUBY="${RUBY_NAME}"
SUB_FILES= nginx.conf nginx-include.conf
+X= 00000000000000000000000000000000
+XX= 0000000000000000000000000000000000000000000000000000000000000000
post-patch:
- @${REINPLACE_CMD} -e 's|%%PREFIX%%|${PREFIX}|' \
+ @${REINPLACE_CMD} -e 's|%%PREFIX%%|${PREFIX}|'\
${WRKSRC}/config/environments/production.rb
do-build:
@@ -119,42 +120,56 @@ do-build:
HOME=${WRKSRC_mn} yarn config set yarn-offline-mirror ${WRKSRC_mn} --offline
HOME=${WRKSRC_mn} yarn config set nodedir ${LOCALBASE} --offline
@${CP} ${FILESDIR}/yarn.lock.in ${WRKSRC}/yarn.lock
- (cd ${WRKSRC} && HOME=${WRKSRC_mn} yarn --offline)
-# (cd ${WRKSRC} && \
-# NODE_ENV=production RAILS_ENV=production \
-# ./node_modules/.bin/webpack --config config/webpack/production.js)
- (cd ${WRKSRC} && \
- NODE_ENV=production \
- ./node_modules/.bin/webpack --config config/webpack/production.js)
+ (cd ${WRKSRC};\
+ HOME=${WRKSRC_mn} yarn --offline;\
+ SECRET_KEY_BASE=x RAILS_ENV=production rails assets:precompile;\
+ ${REINPLACE_CMD} -e\
+ "s|^ cache_dir:.*| cache_dir: '/var/cache/mastodon',|"\
+ ${WRKSRC}/config/boot.rb)
+ (cd ${WRKSRC}/public/assets &&\
+ ${MV} .sprockets-manifest-*.json .sprockets-manifest-${X}.json &&\
+ ${MV} doorkeeper/application-*.css doorkeeper/application-${XX}.css &&\
+ ${MV} doorkeeper/application-*.css.gz doorkeeper/application-${XX}.css.gz &&\
+ ${MV} doorkeeper/admin/application-*.css doorkeeper/admin/application-${XX}.css &&\
+ ${MV} doorkeeper/admin/application-*.css.gz doorkeeper/admin/application-${XX}.css.gz &&\
+ ${MV} pghero/application-*.css pghero/application-${XX}.css &&\
+ ${MV} pghero/application-*.css.gz pghero/application-${XX}.css.gz &&\
+ ${MV} pghero/application-*.js pghero/application-${XX}.js &&\
+ ${MV} pghero/application-*.js.gz pghero/application-${XX}.js.gz &&\
+ ${MV} pghero/favicon-*.png pghero/favicon-${XX}.png)
+ ${REINPLACE_CMD} -e 's|application-[0-9A-Za-z]\{64\}|application-${XX}|g'\
+ ${WRKSRC}/public/assets/.sprockets-manifest-${X}.json
+ ${REINPLACE_CMD} -e 's|"digest":"[0-9A-Za-z]\{64\}"|"digest":"${XX}"|g'\
+ ${WRKSRC}/public/assets/.sprockets-manifest-${X}.json
do-install:
- @${RM} -r ${WRKSRC}/node_modules/emoji* \
- ${WRKSRC}/node_modules/*/man \
- ${WRKSRC}/node_modules/*/node_modules \
- ${WRKSRC}/node_modules/node-sass \
+ @${RM} -r ${WRKSRC}/node_modules/emoji*\
+ ${WRKSRC}/node_modules/*/man\
+ ${WRKSRC}/node_modules/*/node_modules\
+ ${WRKSRC}/node_modules/node-sass\
${WRKSRC}/node_modules/uws/build
- @${RM} ${WRKSRC}/Gemfile.lock \
- ${WRKSRC}/lib/tasks/auto_annotate_models.rake \
- ${WRKSRC}/node_modules/uws/uws_darwin_* \
- ${WRKSRC}/node_modules/uws/uws_linux_* \
- ${WRKSRC}/node_modules/uws/uws_win32_* \
- ${WRKSRC}/node_modules/stringz/coverage/lcov.info \
- ${WRKSRC}/node_modules/.bin/node-sass \
+ @${RM} ${WRKSRC}/Gemfile.lock\
+ ${WRKSRC}/lib/tasks/auto_annotate_models.rake\
+ ${WRKSRC}/node_modules/uws/uws_darwin_*\
+ ${WRKSRC}/node_modules/uws/uws_linux_*\
+ ${WRKSRC}/node_modules/uws/uws_win32_*\
+ ${WRKSRC}/node_modules/stringz/coverage/lcov.info\
+ ${WRKSRC}/node_modules/.bin/node-sass\
${WRKSRC}/node_modules/uws/build_log.txt
${STRIP_CMD} ${WRKSRC}/node_modules/uws/uws_freebsd_${NODE_ABI}.node
- ${MKDIR} ${STAGEDIR}${WWWDIR} ${STAGEDIR}/var/cache/${PORTNAME} \
- ${STAGEDIR}/var/log/${PORTNAME} \
+ ${MKDIR} ${STAGEDIR}${WWWDIR} ${STAGEDIR}/var/cache/${PORTNAME}\
+ ${STAGEDIR}/var/log/${PORTNAME}\
${STAGEDIR}/var/run/${PORTNAME}
- ${INSTALL_DATA} ${WRKDIR}/nginx.conf \
+ ${INSTALL_DATA} ${WRKDIR}/nginx.conf\
${STAGEDIR}${WWWDIR}/nginx.conf.sample
- ${INSTALL_DATA} ${WRKDIR}/nginx-include.conf \
+ ${INSTALL_DATA} ${WRKDIR}/nginx-include.conf\
${STAGEDIR}${WWWDIR}/nginx-include.conf.sample
- ${INSTALL_DATA} ${WRKSRC}/.env.production.sample ${WRKSRC}/app.json \
- ${WRKSRC}/config.ru ${WRKSRC}/Gemfile ${WRKSRC}/LICENSE \
- ${WRKSRC}/package.json ${WRKSRC}/Rakefile \
+ ${INSTALL_DATA} ${WRKSRC}/.env.production.sample ${WRKSRC}/app.json\
+ ${WRKSRC}/config.ru ${WRKSRC}/Gemfile ${WRKSRC}/LICENSE\
+ ${WRKSRC}/package.json ${WRKSRC}/Rakefile\
${STAGEDIR}${WWWDIR}
- (cd ${WRKSRC} && ${COPYTREE_SHARE} \
- "app bin config db lib log node_modules public spec streaming vendor" \
+ (cd ${WRKSRC} && ${COPYTREE_SHARE}\
+ "app bin config db lib log node_modules public spec streaming vendor"\
${STAGEDIR}${WWWDIR})
.include <bsd.port.pre.mk>
diff --git a/net-im/mastodon/files/patch-config_boot.rb b/net-im/mastodon/files/patch-config_boot.rb
deleted file mode 100644
index 86243892b5eb..000000000000
--- a/net-im/mastodon/files/patch-config_boot.rb
+++ /dev/null
@@ -1,11 +0,0 @@
---- config/boot.rb.orig 2018-01-24 12:29:46 UTC
-+++ config/boot.rb
-@@ -4,7 +4,7 @@ require 'bundler/setup' # Set up gems li
- require 'bootsnap'
-
- Bootsnap.setup(
-- cache_dir: 'tmp/cache',
-+ cache_dir: '/var/cache/mastodon',
- development_mode: ENV['RAILS_ENV'] == 'development',
- load_path_cache: true,
- autoload_paths_cache: true,
diff --git a/net-im/mastodon/pkg-plist b/net-im/mastodon/pkg-plist
index 76dd26c39e8f..093161e6ca5e 100644
--- a/net-im/mastodon/pkg-plist
+++ b/net-im/mastodon/pkg-plist
@@ -1945,6 +1945,9 @@
@dir %%WWWDIR%%/node_modules/yargs/locales
@dir %%WWWDIR%%/public
@dir %%WWWDIR%%/public/assets
+@dir %%WWWDIR%%/public/assets/pghero
+@dir %%WWWDIR%%/public/assets/doorkeeper
+@dir %%WWWDIR%%/public/assets/doorkeeper/admin
@dir %%WWWDIR%%/public/avatars
@dir %%WWWDIR%%/public/avatars/original
@dir %%WWWDIR%%/public/emoji
@@ -16060,6 +16063,17 @@
%%WWWDIR%%/public/500.html
%%WWWDIR%%/public/android-chrome-192x192.png
%%WWWDIR%%/public/apple-touch-icon.png
+%%WWWDIR%%/public/assets/.sprockets-manifest-00000000000000000000000000000000.json
+%%WWWDIR%%/public/assets/500.html
+%%WWWDIR%%/public/assets/doorkeeper/admin/application-0000000000000000000000000000000000000000000000000000000000000000.css
+%%WWWDIR%%/public/assets/doorkeeper/admin/application-0000000000000000000000000000000000000000000000000000000000000000.css.gz
+%%WWWDIR%%/public/assets/doorkeeper/application-0000000000000000000000000000000000000000000000000000000000000000.css
+%%WWWDIR%%/public/assets/doorkeeper/application-0000000000000000000000000000000000000000000000000000000000000000.css.gz
+%%WWWDIR%%/public/assets/pghero/application-0000000000000000000000000000000000000000000000000000000000000000.js
+%%WWWDIR%%/public/assets/pghero/application-0000000000000000000000000000000000000000000000000000000000000000.js.gz
+%%WWWDIR%%/public/assets/pghero/application-0000000000000000000000000000000000000000000000000000000000000000.css
+%%WWWDIR%%/public/assets/pghero/application-0000000000000000000000000000000000000000000000000000000000000000.css.gz
+%%WWWDIR%%/public/assets/pghero/favicon-0000000000000000000000000000000000000000000000000000000000000000.png
%%WWWDIR%%/public/assets/sw.js
%%WWWDIR%%/public/avatars/original/missing.png
%%WWWDIR%%/public/badge.png