View Issue Details

IDProjectCategoryView StatusLast Update
0005893GNUnetbuild processpublic2022-10-23 03:47
Reporternikita Assigned Towillow  
PrioritynormalSeverityminorReproducibilityhave not tried
Status feedbackResolutionopen 
Target Version0.18.1 
Summary0005893: replace /tmp in src and elsewhere with something like GNUNET_TMP, again
DescriptionThis comes from reading a bug report never filed with us from a rather creative nixpkg.

For pkgsrc I am in the same position as nixpkgs, /tmp might not always exist (see previous discussions on and the implementation of GNUNET_TMP for config files).
We still hardcode /tmp in some files, and we should use something which is similar to GNUNET_TMP.
Tagschore

Relationships

related to 0006114 closedschanzen Tests failing on Guix System 

Activities

willow

2022-08-28 22:57

developer   ~0019066

I've made some progress with this. I pushed a small branch that removed a lot of references to /tmp in the C files, though a lot of what remains is in Python, shell scripts, and configuration files. I know that it's possible to get configuration values for paths in C source code, but is there a standard way to obtain GNUNET_TMP for Python/shell?

schanzen

2022-08-29 09:05

administrator   ~0019070

Use `gnunet-config` CLI from withing python and parse the output:

$ gnunet-config -f -s PATHS -o GNUNET_TMP

willow

2022-08-29 20:08

developer   ~0019073

Last edited: 2022-08-29 20:36

Thanks for the command.

I'm noticing a lot of duplicated code (sometimes slightly different) to obtain a temporary file path (examples in src/arm/test_gnunet_arm.py.in, src/statistics/test_gnunet_statistics.py.in). I notice that it reads certain environment variables first to find it, then falls back on "/tmp". What is the desired behaviour here? Should the other variables be checked, falling back to GNUNET_TMP, or should we just jump straight to GNUNET_TMP?

There are similar checks in a few of the shell files: ${TMPDIR:-/tmp}

There's at least one FIXME comment that indicates a desire to break those reused bits of code into a separate module. Where exactly would that go?

Tangentially, what does that .in extension specify? I assume it's short for "input" to a macro expander or something similar.

schanzen

2022-08-29 23:03

administrator   ~0019074

I think the goal was to make everything more portable. I am not sure _how_ exactly this issue is supposed to be fixed, however.

".in" files are files produced by automake. They get converted to the "actual" file then ./configure is run. You can, for example, get build time variables and put them into your script using "sed". Useful sometimes for OS-specific paths or binary locations.

schanzen

2022-10-22 15:11

administrator   ~0019269

I this done or still in progress? I remember merging your branch a few days ago.

willow

2022-10-22 16:49

developer   ~0019270

I've pulled everything down to master, ran "rgrep tmp/", and cleaned up and annotated the results for your perusal. The most serious blocker right now is dealing with hardcoded paths in C that mention /tmp/ that are used by functions other than "GNUNET_DISK_directory_create/delete" (which I've found equivalents of that use values in .conf files).
temp_locs (15,717 bytes)   
(Two hardcoded strings)
src/datastore/perf_plugin_datastore.c:  GNUNET_snprintf (dir_name, sizeof(dir_name), "/tmp/perf-gnunet-datastore-%s",

src/datastore/test_plugin_datastore.c:                   "/tmp/test-gnunet-datastore-plugin-%s", plugin_name);

(Old docs)
src/datastore/plugin_datastore_mysql.c: *     through socket '/tmp/mysql.sock' (2)" it may be resolvable by
src/datastore/plugin_datastore_mysql.c: *     "ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock"

(More docs)
src/include/gnunet_disk_lib.h: *        does NOT contain "XXXXXX" or "/tmp/".
src/include/gnunet_disk_lib.h: *        does NOT contain "XXXXXX" or "/tmp/".

(Easily solved by bringing in the top-level configuration)
src/testbed-logger/testbed-logger.conf.in:# STATS_DIR = /tmp/load
src/testbed-logger/testbed-logger.conf:# STATS_DIR = /tmp/load

(Python files with hardcoded tmp: solvable)
src/integration-tests/gnunet_testing.py.in:            shutil.rmtree("/tmp/" + testname, True)

src/fs/test_gnunet_fs_psd.py.in:    shutil.rmtree("/tmp/gnunet-test-fs-py-psd", True)
src/fs/test_gnunet_fs_psd.py.in:        shutil.rmtree("/tmp/gnunet-test-fs-py-psd", True)
src/fs/test_gnunet_fs_idx.py.in:    shutil.rmtree("/tmp/gnunet-test-fs-py-idx", True)
src/fs/test_gnunet_fs_idx.py.in:        shutil.rmtree("/tmp/gnunet-test-fs-py-idx", True)

(hardcoded strings)
src/fs/test_fs.c:  fn = GNUNET_malloc (strlen ("/tmp/gnunet-basic_fsui_test/BASIC_FSUI_TEST")
src/fs/test_fs.c:                   strlen ("/tmp/gnunet-basic_fsui_test/BASIC_FSUI_TEST") + 14,
src/fs/test_fs.c:                   "/tmp/gnunet-basic_fsui_test/BASIC_FSUI_TEST%u", i);

(more python!)
src/fs/test_gnunet_fs_rec.py.in:    shutil.rmtree("/tmp/gnunet-test-fs-py-rec", True)
src/fs/test_gnunet_fs_rec.py.in:        shutil.rmtree("/tmp/gnunet-test-fs-py-rec", True)

(conf files can be updated easily)
src/testbed/testbed.conf:# STATS_DIR = /tmp/load
src/testbed/testbed.conf.in:# STATS_DIR = /tmp/load

(I think these could be rewritten to be retrieved from a configuration file, though I'm not sure about which one)
src/transport/gnunet-helper-transport-wlan-dummy.c:#define FIFO_FILE1 "/tmp/test-transport/api-wlan-p1/WLAN_FIFO_in"
src/transport/gnunet-helper-transport-wlan-dummy.c:#define FIFO_FILE2 "/tmp/test-transport/api-wlan-p1/WLAN_FIFO_out"

(More old/vague docs)
src/transport/plugin_transport_unix.c:   * Path of our unix domain socket (/tmp/unix-plugin)

src/abd/test_abd_lookup.conf:#PREFIX = valgrind --leak-check=full --track-origins=yes --log-file=/tmp/credlog

src/conversation/displaydot.sh:dot -Tpng `ls -tr1 /tmp/*rec*.dot | tail -1` | display /dev/stdin &
src/conversation/displaydot.sh:dot -Tpng `ls -tr1 /tmp/*play*.dot | tail -1` | display /dev/stdin &

src/conversation/test.sh:export GST_DEBUG_DUMP_DOT_DIR=/tmp/ 
src/conversation/test.sh:GST_DEBUG_DUMP_DOT_DIR=/tmp/ ./gnunet-helper-audio-record |GST_DEBUG_DUMP_DOT_DIR=/tmp/ ./gnunet-helper-audio-playback

src/scalarproduct/test_scalarproduct.sh:PREFIX=/tmp/test-scalarproduct`date +%H%M%S`
src/scalarproduct/test_scalarproduct_negativezero.sh:PREFIX=/tmp/test-scalarproduct`date +%H%M%S`
src/scalarproduct/test_scalarproduct_negative.sh:PREFIX=/tmp/test-scalarproduct`date +%H%M%S`
src/scalarproduct/perf_scalarproduct.sh:PREFIX=/tmp/test-scalarproduct`date +%H%M%S`

(RPS subsystem test and profiler contain a *lot* of hardcoded paths)
src/rps/test_rps.c:  tofile ("/tmp/rps/peer_ids",
src/rps/test_rps.c:  file_name = "/tmp/rps/received_ids";
src/rps/test_rps.c:  file_name_dh = "/tmp/rps/diehard_input";
src/rps/test_rps.c:    key_char = filename + 20;   /* Length of "/tmp/rps/sampler_el-" */
src/rps/test_rps.c:  if (-1 == GNUNET_DISK_directory_scan ("/tmp/rps/", file_name_cb, NULL))
src/rps/test_rps.c:  to_file ("/tmp/rps/view_sizes.txt",
src/rps/test_rps.c:  to_file ("/tmp/rps/count_in_views.txt",
src/rps/test_rps.c:    to_file ("/tmp/rps/repr.txt",
src/rps/test_rps.c:    to_file ("/tmp/rps/final_stats.dat",
src/rps/test_rps.c:    (void) GNUNET_DISK_directory_remove ("/tmp/rps/");
src/rps/test_rps.c:    GNUNET_DISK_directory_create ("/tmp/rps/");

(Most of these are commented out, but might be necessary)
src/rps/test_rps.conf:#PREFIX = valgrind --leak-check=full --show-leak-kinds=all --log-file=/tmp/rps/valgrind!gnunet-service-rps!%p
src/rps/test_rps.conf:#PREFIX = valgrind --log-file=/tmp/rps/valgrind!gnunet-service-rps!%p
src/rps/test_rps.conf:#OPTIONS=-l /tmp/rps_profiler_logs/rps-[]-%Y-%m-%d.log
src/rps/test_rps.conf:#OPTIONS=-l /tmp/rps_profiler_logs/cadet-[]-%Y-%m-%d.log
src/rps/test_rps.conf:#PREFIX = valgrind --log-file=/tmp/rps/valgrind_gnunet-service-cadet_%p
src/rps/test_rps.conf:#GLOBAL_POSTFIX=-l /tmp/rps_profiler_logs/other-[]-%Y-%m-%d.log

(RPS profiler's hardcoded paths)
src/rps/gnunet-rps-profiler.c:  tofile ("/tmp/rps/peer_ids",
src/rps/gnunet-rps-profiler.c:                          "/tmp/rps/received_ids-%u",
src/rps/gnunet-rps-profiler.c:                          "/tmp/rps/diehard_input-%u",
src/rps/gnunet-rps-profiler.c:                          "/tmp/rps/diehard_input_raw-%u",
src/rps/gnunet-rps-profiler.c:                          "/tmp/rps/diehard_input_raw_aligned-%u",
src/rps/gnunet-rps-profiler.c:                          "/tmp/rps/received_ids-%u",
src/rps/gnunet-rps-profiler.c:                          "/tmp/rps/diehard_input-%u",
src/rps/gnunet-rps-profiler.c:                          "/tmp/rps/diehard_input_raw-%u",
src/rps/gnunet-rps-profiler.c:                          "/tmp/rps/diehard_input_raw_aligned-%u",
src/rps/gnunet-rps-profiler.c:    key_char = filename + 20;   /* Length of "/tmp/rps/sampler_el-" */
src/rps/gnunet-rps-profiler.c:  if (-1 == GNUNET_DISK_directory_scan ("/tmp/rps/", file_name_cb, NULL))
src/rps/gnunet-rps-profiler.c:  to_file ("/tmp/rps/view_sizes.txt",
src/rps/gnunet-rps-profiler.c:  to_file ("/tmp/rps/count_in_views.txt",
src/rps/gnunet-rps-profiler.c:    to_file ("/tmp/rps/repr.txt",
src/rps/gnunet-rps-profiler.c:    to_file ("/tmp/rps/final_stats.csv",
src/rps/gnunet-rps-profiler.c:  to_file ("/tmp/rps/final_stats.dat",
src/rps/gnunet-rps-profiler.c:  (void) GNUNET_DISK_directory_remove ("/tmp/rps/");
src/rps/gnunet-rps-profiler.c:  GNUNET_DISK_directory_create ("/tmp/rps/");

src/rps/profiler_rps.conf:#PREFIX = valgrind --leak-check=full --show-leak-kinds=all --log-file=/tmp/rps/valgrind!gnunet-service-rps!%p
src/rps/profiler_rps.conf:#PREFIX = valgrind --log-file=/tmp/rps/valgrind!gnunet-service-rps!%p
src/rps/profiler_rps.conf:#OPTIONS=-l /tmp/rps_profiler_logs/rps-[]-%Y-%m-%d.log
src/rps/profiler_rps.conf:OPTIONS=-l /tmp/rps_profiler_logs/cadet-[]-%Y-%m-%d.log
src/rps/profiler_rps.conf:#GLOBAL_POSTFIX=-l /tmp/rps_profiler_logs/other-[]-%Y-%m-%d.log

src/rps/rps-test_util.c: * @brief Try to ensure that `/tmp/rps` exists.
src/rps/rps-test_util.c:      GNUNET_DISK_directory_create ("/tmp/rps"))
src/rps/rps-test_util.c:         "Could not create directory `/tmp/rps'\n");
src/rps/rps-test_util.c:                              "/tmp/rps/%s-%s",

(More python!)
src/peerinfo-tool/test_gnunet_peerinfo.py.in:    shutil.rmtree("/tmp/gnunet-test-peerinfo", True)
src/peerinfo-tool/test_gnunet_peerinfo.py.in:# create hostkey via testing lib  # FIXME: The /tmp/ location needs to be adjusted to the TMP variable!
src/peerinfo-tool/test_gnunet_peerinfo.py.in:    '/tmp/gnunet-test-peerinfo/.hostkey'
src/peerinfo-tool/test_gnunet_peerinfo.py.in:        shutil.rmtree("/tmp/gnunet-test-peerinfo", True)

(Commented out but might be needed at some point)
src/namestore/test_namestore_api.conf:#PREFIX = valgrind --track-origins=yes --log-file=/tmp/ns_tx.log
src/namestore/test_namestore_api.conf:# PREFIX = valgrind --leak-check=full --track-origins=yes --log-file=/tmp/v_log 
src/namestore/test_namestore_api_sqlite.conf:# PREFIX = valgrind --leak-check=full --track-origins=yes --log-file=/tmp/v_log 

(More hardcoded paths in C, or docs)
src/testing/testing.c:   * Prefix (e.g. "/tmp/gnunet-testing/") we prepend to each
src/testing/test_testing_portreservation.c:  system = GNUNET_TESTING_system_create ("/tmp/gnunet-testing-new",

(Might not be a problem?)
src/util/disk.c: * @param t template (without XXXXX or "/tmp/")

(Hardcoded path)
src/util/test_socks.c:            "-o", "UserKnownHostsFile /tmp/gnunet_test_socks_ssh_garbage",

(might need updating)
src/util/util.conf:# for all users (i.e. by simply using "/tmp/gnunet-system-runtime/").
src/util/util.conf:# GNUNET_TEST_HOME = /tmp/foo/bar

(hardcoded preprocessor definition)
src/util/test_crypto_edx25519.c:#define KEYFILE "/tmp/test-gnunet-crypto-edx25519.key"

(More hardcoded paths)
src/util/test_configuration.c:  if (GNUNET_OK != GNUNET_CONFIGURATION_write (cfg, "/tmp/gnunet-test.conf"))
src/util/test_configuration.c:  GNUNET_assert (0 == unlink ("/tmp/gnunet-test.conf"));

(hardcoded preprocessor definition)
src/util/test_container_bloomfilter.c:#define TESTFILE "/tmp/bloomtest.dat"

(hardcoded preprocessor definition)
src/util/test_crypto_eddsa.c:#define KEYFILE "/tmp/test-gnunet-crypto-eddsa.key"

(Results in autom4te.cache elided: presumably generated by build system)

doc/system_specific/outdated-and-old-installation-instructions.txt:$ ./configure --prefix=/tmp/gnunet_build
doc/system_specific/outdated-and-old-installation-instructions.txt:GNUnet will be installed in the directory /tmp/gnunet_build (Of course that

doc/man/gnunet.conf.5.in:.Pa /tmp/foo
doc/man/gnunet.conf.5.in:.Pa /tmp/gnunet/foo .
doc/man/gnunet-statistics.1:.Dl $ gnunet-statistics -t /tmp/testbedARtmQv

(Doxygen output elided as it's generated from files in src/)

(Old docs)
doc/handbook/gnunet.info-2:for example ‘/tmp/gnunet.smtp’.  You also need to define a filter that
doc/handbook/gnunet.info-2:     /tmp/gnunet.smtp
doc/handbook/gnunet.info-2:     "X-mailer: GNUnet" PIPE = /tmp/gnunet.smtp
doc/handbook/gnunet.info-1:     through socket '/tmp/mysql.sock' (2)
doc/handbook/gnunet.info-1:     ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
doc/handbook/gnunet.info-1:     UNIXPATH = /tmp/gnunet-service-transport.sock
doc/old/handbook/chapters/developer.texi:example @code{/tmp/gnunet.smtp}. You also need to define a filter that is
doc/old/handbook/chapters/developer.texi:/tmp/gnunet.smtp
doc/old/handbook/chapters/developer.texi:"X-mailer: GNUnet" PIPE = /tmp/gnunet.smtp
doc/old/handbook/chapters/installation.texi:through socket '/tmp/mysql.sock' (2)
doc/old/handbook/chapters/installation.texi:ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
doc/old/handbook/chapters/installation.texi:UNIXPATH = /tmp/gnunet-service-transport.sock

(Couple instances in configure.ac)
configure.ac:AS_IF([ssh -D 12345 -o "BatchMode Yes" -o "UserKnownHostsFile /tmp/gnunet_test_cosks_ssh_garbage" -o "StrictHostKeyChecking no" 127.0.0.1 echo -n 2>/dev/null],
configure.ac:AS_IF([test -f /tmp/gnunet_test_cosks_ssh_garbage],
configure.ac:      [rm -f /tmp/gnunet_test_cosks_ssh_garbage])

(Those also show up in configure script, so they've been elided)
(config.log is a log file and was elided as the use of /tmp/ was not related to GNUnet code)

(Can/should we rely on $tmp?)
build-aux/config.guess:dummy=$tmp/dummy ;

(These scripts used at all?)
contrib/scripts/visualize_stats.sh:TMP=/tmp/.gnuplot_error
contrib/scripts/gnunet-logread/gnunet-logread-ipc-sdedit.in:my $ipc  = $opts{i} || '/tmp/gnunet-logread-ipc.sock';
contrib/scripts/gnunet-logread/gnunet-logread-ipc:ipc=${1:-/tmp/gnunet-logread-ipc.sock}
contrib/scripts/gnunet-logread/gnunet-logread.in:my $DEFAULT_SOCKET = '/tmp/gnunet-logread-ipc.sock';
contrib/scripts/revisionary.sh:CMD_PREPARATION="./bootstrap; ./configure --prefix=/tmp/gnb --with-extractor=/usr/local"

(AppArmor seems to lean on it)
contrib/apparmor/gnunet-service-mesh:  /tmp/gnunet-system-runtime/gnunet-service-mesh.sock w,
contrib/apparmor/gnunet-service-cadet:  /tmp/gnunet-system-runtime/gnunet-service-cadet.sock rw,
contrib/apparmor/gnunet-service-identity:  /tmp/gnunet-*-runtime/ a,
contrib/apparmor/gnunet-service-nse:  /tmp/gnunet-system-runtime/gnunet-service-nse.sock rw,
contrib/apparmor/gnunet-service-testbed:  /tmp/gnunet-system-runtime/ w,
contrib/apparmor/gnunet-service-testbed:  /tmp/gnunet-system-runtime/gnunet-service-testbed-barrier.sock w,
contrib/apparmor/gnunet-service-testbed:  /tmp/gnunet-system-runtime/gnunet-service-testbed.sock w,
contrib/apparmor/gnunet-service-resolver:  /tmp/gnunet-system-runtime/gnunet-service-resolver.sock w,
contrib/apparmor/gnunet-service-namestore:  /tmp/gnunet-*-runtime/ a,
contrib/apparmor/gnunet-service-arm:  /tmp/gnunet-*-runtime/ rw,
contrib/apparmor/gnunet-service-arm:# /tmp/gnunet-*-runtime/gnunet-service-arm.sock rw,
contrib/apparmor/gnunet-service-arm:# /tmp/gnunet-*-runtime/gnunet-service-namestore.sock r,
contrib/apparmor/gnunet-service-arm:# /tmp/gnunet-*-runtime/gnunet-service-identity.sock r,
contrib/apparmor/gnunet-service-arm:# /tmp/gnunet-*-runtime/gnunet-service-gns.sock r,
contrib/apparmor/gnunet-service-arm:  /tmp/gnunet-*-runtime/gnunet-service-*.sock rw,
contrib/apparmor/gnunet-arm:  /tmp/gnunet-*-runtime/ rw,
contrib/apparmor/gnunet-arm:  /tmp/gnunet-*-runtime/gnunet-service-arm.sock rw,
contrib/apparmor/gnunet-service-template:  /tmp/gnunet-system-runtime/ w,
contrib/apparmor/gnunet-service-template:  /tmp/gnunet-system-runtime/gnunet-service-template.sock w,
contrib/apparmor/gnunet-service-gns:  /tmp/gnunet-*-runtime/gnunet-service-gns.sock rw,
contrib/apparmor/gnunet-service-fs:  /tmp/gnunet-system-runtime/gnunet-service-fs.sock w,
contrib/apparmor/abstractions/gnunet-test:  /tmp/testbed*/	rw,
contrib/apparmor/abstractions/gnunet-test:  /tmp/testbed*/**	rwk,
contrib/apparmor/abstractions/gnunet-test:  /tmp/testbed-helper*/ rw,
contrib/apparmor/abstractions/gnunet-test:  /tmp/gnunet-testing*  rw,
contrib/apparmor/abstractions/gnunet-test:  /tmp/gnunet_service_test*/ rw,
contrib/apparmor/abstractions/gnunet-test:  /tmp/gnunet_service_test*/** rw,
contrib/apparmor/gnunet-service-testbed-logger:  /tmp/archlinux_*.dat w,
contrib/apparmor/gnunet-service-testbed-logger:  /tmp/gnunet-system-runtime/ w,
contrib/apparmor/gnunet-service-testbed-logger:  /tmp/gnunet-system-runtime/gnunet-gnunet-testbed-logger.sock w,
contrib/apparmor/gnunet-service-revocation:  /tmp/gnunet-system-runtime/gnunet-service-revocation.sock rw,
contrib/apparmor/gnunet-service-dht:  /tmp/gnunet-system-runtime/gnunet-service-dht.sock w,
contrib/apparmor/gnunet-service-dht:  /tmp/gnunet-datacachebloom* rw,

(Where are these folders generated?)
contrib/services/openrc/gnunet.initd:	rm -rf /tmp/gnunet-gnunet-runtime >/dev/null 2>&1
contrib/services/openrc/gnunet.initd:	rm -rf /tmp/gnunet-system-runtime >/dev/null 2>&1

(Don't know enoguh about Docker to know if these are a problem)
contrib/docker/Dockerfile:      /tmp/*
contrib/docker/Dockerfile:RUN wget -O /tmp/gnurl.tar.xz https://ftpmirror.gnu.org/gnu/gnunet/gnurl-${GNURL_VERSION}.tar.xz
contrib/docker/Dockerfile:    rm -rf /tmp/gnurl*

(these are probably fine, right?)
debian/rules:	mkdir -p debian/tmp/etc
debian/rules:	cp debian/etc/gnunet.conf debian/tmp/etc/
debian/rules:	rm -f debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/*.la \
debian/rules:		debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/gnunet/*.la \
debian/rules:		debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/gnunet/nss/*.la \
debian/rules:		debian/tmp/usr/share/doc/gnunet/COPYING \
debian/rules:		debian/tmp/usr/bin/gnunet-service-template \
debian/rules:		debian/tmp/usr/bin/gnunet-template \
debian/rules:		debian/tmp/usr/bin/gnunet-helper-transport-wlan-dummy

(Build string seems to use /tmp/ too)
.buildbot/build.sh:rm -rf /tmp/gnunet
.buildbot/build.sh:./bootstrap && ./configure --prefix=/tmp/gnunet --enable-experimental && make -j16


temp_locs (15,717 bytes)   

schanzen

2022-10-23 03:47

administrator   ~0019275

Ok. I think most of the C files don't have any business hard coding the /tmp locations if they could be calling GNUNET_CONFIGURATION.
But, this was just to do some bug housekeeping to I will bump this to 0.18.1 for now

Issue History

Date Modified Username Field Change
2019-09-13 19:35 nikita New Issue
2019-11-16 18:38 Christian Grothoff Target Version 0.12.0 =>
2020-04-29 12:20 nikita Relationship added related to 0006114
2020-06-01 00:49 Adminknox Issue cloned: 0006303
2020-10-29 11:15 schanzen Assigned To => schanzen
2020-10-29 11:15 schanzen Status new => acknowledged
2020-10-29 11:15 schanzen Target Version => 0.15.0
2020-11-11 11:03 schanzen Target Version 0.15.0 => 0.14.1
2021-02-21 11:00 schanzen Tag Attached: chore
2021-04-05 11:25 schanzen Target Version 0.14.1 => 0.14.2
2021-06-10 19:37 schanzen Target Version 0.14.2 => 0.15.0
2021-07-31 10:58 schanzen Target Version 0.15.0 => 0.15.1
2022-02-26 23:14 schanzen Target Version 0.15.1 => 0.17.0
2022-06-04 23:13 schanzen Target Version 0.17.0 => 0.18.0
2022-08-28 22:57 willow Note Added: 0019066
2022-08-29 09:05 schanzen Note Added: 0019070
2022-08-29 10:33 schanzen Target Version 0.18.0 => 0.17.4
2022-08-29 10:34 schanzen Target Version 0.17.4 => 0.17.5
2022-08-29 10:35 schanzen Assigned To schanzen => willow
2022-08-29 20:08 willow Note Added: 0019073
2022-08-29 20:08 willow Status acknowledged => assigned
2022-08-29 20:36 willow Note Edited: 0019073
2022-08-29 23:03 schanzen Note Added: 0019074
2022-09-04 11:05 schanzen Target Version 0.17.5 => 0.17.6
2022-09-26 05:01 schanzen Target Version 0.17.6 => 0.17.7
2022-10-21 07:33 schanzen Target Version 0.17.7 => 0.18.0
2022-10-22 15:11 schanzen Note Added: 0019269
2022-10-22 15:12 schanzen Status assigned => feedback
2022-10-22 16:49 willow Note Added: 0019270
2022-10-22 16:49 willow File Added: temp_locs
2022-10-23 03:47 schanzen Note Added: 0019275
2022-10-23 03:47 schanzen Target Version 0.18.0 => 0.18.1