mirror of
https://github.com/luanti-org/luanti.git
synced 2025-10-12 16:15:20 +02:00
Delete clang-format files and comments (#14079)
This commit is contained in:
@@ -1,500 +0,0 @@
|
||||
src/activeobject.h
|
||||
src/ban.cpp
|
||||
src/camera.cpp
|
||||
src/camera.h
|
||||
src/chat.cpp
|
||||
src/chat.h
|
||||
src/chat_interface.h
|
||||
src/client/clientlauncher.cpp
|
||||
src/client/clientlauncher.h
|
||||
src/client/sound_openal.cpp
|
||||
src/client.cpp
|
||||
src/clientenvironment.cpp
|
||||
src/clientenvironment.h
|
||||
src/client/gameui.cpp
|
||||
src/client.h
|
||||
src/client/hud.cpp
|
||||
src/client/hud.h
|
||||
src/clientiface.cpp
|
||||
src/clientiface.h
|
||||
src/client/joystick_controller.cpp
|
||||
src/client/joystick_controller.h
|
||||
src/clientmap.cpp
|
||||
src/clientmap.h
|
||||
src/clientmedia.cpp
|
||||
src/clientmedia.h
|
||||
src/clientobject.cpp
|
||||
src/clientobject.h
|
||||
src/client/render/core.cpp
|
||||
src/client/renderingengine.cpp
|
||||
src/client/render/interlaced.cpp
|
||||
src/client/render/plain.cpp
|
||||
src/client/render/sidebyside.cpp
|
||||
src/client/render/stereo.cpp
|
||||
src/client/tile.cpp
|
||||
src/client/tile.h
|
||||
src/client/fontengine.h
|
||||
src/client/clientenvironment.cpp
|
||||
src/client/mapblock_mesh.cpp
|
||||
src/client/sound_openal.h
|
||||
src/client/clouds.cpp
|
||||
src/client/fontengine.cpp
|
||||
src/client/camera.h
|
||||
src/client/hud.cpp
|
||||
src/client/clientmap.cpp
|
||||
src/client/sound_openal.cpp
|
||||
src/client/minimap.h
|
||||
src/client/content_cao.cpp
|
||||
src/client/localplayer.h
|
||||
src/client/mapblock_mesh.h
|
||||
src/client/mesh.cpp
|
||||
src/client/sound.cpp
|
||||
src/client/guiscalingfilter.cpp
|
||||
src/client/content_cso.cpp
|
||||
src/client/gameui.cpp
|
||||
src/client/wieldmesh.cpp
|
||||
src/client/clientmedia.h
|
||||
src/client/game.cpp
|
||||
src/client/keys.h
|
||||
src/client/client.h
|
||||
src/client/shader.cpp
|
||||
src/client/clientmap.h
|
||||
src/client/inputhandler.h
|
||||
src/client/content_mapblock.h
|
||||
src/client/game.h
|
||||
src/client/mesh.h
|
||||
src/client/camera.cpp
|
||||
src/client/sky.h
|
||||
src/client/mesh_generator_thread.cpp
|
||||
src/client/guiscalingfilter.h
|
||||
src/client/clientobject.cpp
|
||||
src/client/tile.cpp
|
||||
src/client/hud.h
|
||||
src/client/inputhandler.cpp
|
||||
src/client/clientevent.h
|
||||
src/client/gameui.h
|
||||
src/client/content_cso.h
|
||||
src/client/sky.cpp
|
||||
src/client/localplayer.cpp
|
||||
src/client/content_mapblock.cpp
|
||||
src/client/clientobject.h
|
||||
src/client/filecache.cpp
|
||||
src/client/particles.h
|
||||
src/client/clientenvironment.h
|
||||
src/client/imagefilters.h
|
||||
src/client/renderingengine.cpp
|
||||
src/client/tile.h
|
||||
src/client/clientmedia.cpp
|
||||
src/client/event_manager.h
|
||||
src/client/joystick_controller.h
|
||||
src/client/clouds.h
|
||||
src/client/clientlauncher.h
|
||||
src/client/content_cao.h
|
||||
src/client/minimap.cpp
|
||||
src/client/sound.h
|
||||
src/client/keycode.cpp
|
||||
src/client/particles.cpp
|
||||
src/client/joystick_controller.cpp
|
||||
src/client/keycode.h
|
||||
src/client/wieldmesh.h
|
||||
src/client/filecache.h
|
||||
src/client/shader.h
|
||||
src/client/mesh_generator_thread.h
|
||||
src/client/renderingengine.h
|
||||
src/client/client.cpp
|
||||
src/client/imagefilters.cpp
|
||||
src/client/clientlauncher.cpp
|
||||
src/clouds.cpp
|
||||
src/clouds.h
|
||||
src/collision.cpp
|
||||
src/collision.h
|
||||
src/config.h
|
||||
src/content_cao.cpp
|
||||
src/content_cao.h
|
||||
src/content_cso.cpp
|
||||
src/content_cso.h
|
||||
src/content_mapblock.cpp
|
||||
src/content_mapblock.h
|
||||
src/content_mapnode.cpp
|
||||
src/content_nodemeta.cpp
|
||||
src/content_nodemeta.h
|
||||
src/convert_json.cpp
|
||||
src/convert_json.h
|
||||
src/craftdef.cpp
|
||||
src/craftdef.h
|
||||
src/database/database.cpp
|
||||
src/database/database-dummy.cpp
|
||||
src/database/database-files.cpp
|
||||
src/database/database-leveldb.cpp
|
||||
src/database/database-postgresql.cpp
|
||||
src/database/database-postgresql.h
|
||||
src/database/database-redis.cpp
|
||||
src/database/database-sqlite3.cpp
|
||||
src/database/database-sqlite3.h
|
||||
src/daynightratio.h
|
||||
src/debug.cpp
|
||||
src/debug.h
|
||||
src/defaultsettings.cpp
|
||||
src/emerge.cpp
|
||||
src/emerge.h
|
||||
src/environment.cpp
|
||||
src/exceptions.h
|
||||
src/face_position_cache.cpp
|
||||
src/face_position_cache.h
|
||||
src/filecache.cpp
|
||||
src/filesys.cpp
|
||||
src/filesys.h
|
||||
src/fontengine.cpp
|
||||
src/fontengine.h
|
||||
src/game.cpp
|
||||
src/gamedef.h
|
||||
src/game.h
|
||||
src/gettext.cpp
|
||||
src/gettext.h
|
||||
src/gui/guiAnimatedImage.cpp
|
||||
src/gui/guiAnimatedImage.h
|
||||
src/gui/guiBackgroundImage.cpp
|
||||
src/gui/guiBackgroundImage.h
|
||||
src/gui/guiBox.cpp
|
||||
src/gui/guiBox.h
|
||||
src/gui/guiButton.cpp
|
||||
src/gui/guiButton.h
|
||||
src/gui/guiButtonImage.cpp
|
||||
src/gui/guiButtonImage.h
|
||||
src/gui/guiButtonItemImage.cpp
|
||||
src/gui/guiButtonItemImage.h
|
||||
src/gui/guiChatConsole.cpp
|
||||
src/gui/guiChatConsole.h
|
||||
src/gui/guiConfirmRegistration.cpp
|
||||
src/gui/guiEditBoxWithScrollbar.cpp
|
||||
src/gui/guiEditBoxWithScrollbar.h
|
||||
src/gui/guiEngine.cpp
|
||||
src/gui/guiEngine.h
|
||||
src/gui/guiFormSpecMenu.cpp
|
||||
src/gui/guiFormSpecMenu.h
|
||||
src/gui/guiKeyChangeMenu.cpp
|
||||
src/gui/guiHyperText.cpp
|
||||
src/gui/guiHyperText.h
|
||||
src/gui/guiInventoryList.cpp
|
||||
src/gui/guiInventoryList.h
|
||||
src/gui/guiItemImage.cpp
|
||||
src/gui/guiItemImage.h
|
||||
src/gui/guiMainMenu.h
|
||||
src/gui/guiPasswordChange.cpp
|
||||
src/gui/guiPathSelectMenu.cpp
|
||||
src/gui/guiPathSelectMenu.h
|
||||
src/gui/guiScene.cpp
|
||||
src/gui/guiScene.h
|
||||
src/gui/guiScrollBar.cpp
|
||||
src/gui/guiSkin.cpp
|
||||
src/gui/guiSkin.h
|
||||
src/gui/guiTable.cpp
|
||||
src/gui/guiTable.h
|
||||
src/gui/guiVolumeChange.cpp
|
||||
src/gui/guiVolumeChange.h
|
||||
src/gui/mainmenumanager.h
|
||||
src/gui/modalMenu.h
|
||||
src/guiscalingfilter.cpp
|
||||
src/guiscalingfilter.h
|
||||
src/gui/StyleSpec.h
|
||||
src/gui/touchscreengui.cpp
|
||||
src/httpfetch.cpp
|
||||
src/hud.cpp
|
||||
src/hud.h
|
||||
src/imagefilters.cpp
|
||||
src/imagefilters.h
|
||||
src/inventory.cpp
|
||||
src/inventory.h
|
||||
src/inventorymanager.cpp
|
||||
src/inventorymanager.h
|
||||
src/irrlicht_changes/CGUITTFont.cpp
|
||||
src/irrlicht_changes/CGUITTFont.h
|
||||
src/irrlicht_changes/irrUString.h
|
||||
src/irrlicht_changes/static_text.cpp
|
||||
src/irrlicht_changes/static_text.h
|
||||
src/irrlichttypes.h
|
||||
src/itemdef.cpp
|
||||
src/itemdef.h
|
||||
src/itemstackmetadata.cpp
|
||||
src/keycode.cpp
|
||||
src/light.cpp
|
||||
src/localplayer.cpp
|
||||
src/log.cpp
|
||||
src/log.h
|
||||
src/main.cpp
|
||||
src/mapblock.cpp
|
||||
src/mapblock.h
|
||||
src/mapblock_mesh.cpp
|
||||
src/mapblock_mesh.h
|
||||
src/map.cpp
|
||||
src/mapgen/cavegen.cpp
|
||||
src/mapgen/cavegen.h
|
||||
src/mapgen/dungeongen.cpp
|
||||
src/mapgen/dungeongen.h
|
||||
src/mapgen/mapgen.cpp
|
||||
src/mapgen/mapgen.h
|
||||
src/mapgen/mapgen_carpathian.cpp
|
||||
src/mapgen/mapgen_carpathian.h
|
||||
src/mapgen/mapgen_flat.cpp
|
||||
src/mapgen/mapgen_flat.h
|
||||
src/mapgen/mapgen_fractal.cpp
|
||||
src/mapgen/mapgen_fractal.h
|
||||
src/mapgen/mapgen_singlenode.cpp
|
||||
src/mapgen/mapgen_singlenode.h
|
||||
src/mapgen/mapgen_v5.cpp
|
||||
src/mapgen/mapgen_v5.h
|
||||
src/mapgen/mapgen_v6.cpp
|
||||
src/mapgen/mapgen_v6.h
|
||||
src/mapgen/mapgen_v7.cpp
|
||||
src/mapgen/mapgen_v7.h
|
||||
src/mapgen/mapgen_valleys.cpp
|
||||
src/mapgen/mapgen_valleys.h
|
||||
src/mapgen/mg_biome.cpp
|
||||
src/mapgen/mg_biome.h
|
||||
src/mapgen/mg_decoration.cpp
|
||||
src/mapgen/mg_decoration.h
|
||||
src/mapgen/mg_ore.cpp
|
||||
src/mapgen/mg_ore.h
|
||||
src/mapgen/mg_schematic.cpp
|
||||
src/mapgen/mg_schematic.h
|
||||
src/mapgen/treegen.cpp
|
||||
src/mapgen/treegen.h
|
||||
src/map.h
|
||||
src/mapnode.cpp
|
||||
src/mapnode.h
|
||||
src/mapsector.cpp
|
||||
src/mapsector.h
|
||||
src/map_settings_manager.cpp
|
||||
src/map_settings_manager.h
|
||||
src/mesh.cpp
|
||||
src/mesh_generator_thread.cpp
|
||||
src/mesh.h
|
||||
src/metadata.h
|
||||
src/minimap.cpp
|
||||
src/minimap.h
|
||||
src/mods.cpp
|
||||
src/mods.h
|
||||
src/network/address.cpp
|
||||
src/network/clientopcodes.cpp
|
||||
src/network/clientopcodes.h
|
||||
src/network/clientpackethandler.cpp
|
||||
src/network/connection.cpp
|
||||
src/network/connection.h
|
||||
src/network/connectionthreads.cpp
|
||||
src/network/networkpacket.cpp
|
||||
src/network/networkprotocol.h
|
||||
src/network/serveropcodes.cpp
|
||||
src/network/serveropcodes.h
|
||||
src/network/serverpackethandler.cpp
|
||||
src/nodedef.cpp
|
||||
src/nodedef.h
|
||||
src/nodemetadata.cpp
|
||||
src/nodemetadata.h
|
||||
src/nodetimer.cpp
|
||||
src/nodetimer.h
|
||||
src/noise.cpp
|
||||
src/noise.h
|
||||
src/objdef.cpp
|
||||
src/objdef.h
|
||||
src/object_properties.cpp
|
||||
src/object_properties.h
|
||||
src/particles.cpp
|
||||
src/particles.h
|
||||
src/pathfinder.cpp
|
||||
src/pathfinder.h
|
||||
src/player.cpp
|
||||
src/player.h
|
||||
src/porting_android.cpp
|
||||
src/porting_android.h
|
||||
src/porting.cpp
|
||||
src/porting.h
|
||||
src/profiler.h
|
||||
src/raycast.cpp
|
||||
src/raycast.h
|
||||
src/reflowscan.cpp
|
||||
src/reflowscan.h
|
||||
src/remoteplayer.cpp
|
||||
src/rollback.cpp
|
||||
src/rollback.h
|
||||
src/rollback_interface.cpp
|
||||
src/rollback_interface.h
|
||||
src/script/common/c_content.cpp
|
||||
src/script/common/c_content.h
|
||||
src/script/common/c_converter.cpp
|
||||
src/script/common/c_converter.h
|
||||
src/script/common/c_internal.cpp
|
||||
src/script/common/c_internal.h
|
||||
src/script/common/c_types.cpp
|
||||
src/script/common/c_types.h
|
||||
src/script/cpp_api/s_async.cpp
|
||||
src/script/cpp_api/s_async.h
|
||||
src/script/cpp_api/s_base.cpp
|
||||
src/script/cpp_api/s_base.h
|
||||
src/script/cpp_api/s_client.cpp
|
||||
src/script/cpp_api/s_entity.cpp
|
||||
src/script/cpp_api/s_entity.h
|
||||
src/script/cpp_api/s_env.cpp
|
||||
src/script/cpp_api/s_env.h
|
||||
src/script/cpp_api/s_internal.h
|
||||
src/script/cpp_api/s_inventory.cpp
|
||||
src/script/cpp_api/s_inventory.h
|
||||
src/script/cpp_api/s_item.cpp
|
||||
src/script/cpp_api/s_item.h
|
||||
src/script/cpp_api/s_mainmenu.h
|
||||
src/script/cpp_api/s_node.cpp
|
||||
src/script/cpp_api/s_node.h
|
||||
src/script/cpp_api/s_nodemeta.cpp
|
||||
src/script/cpp_api/s_nodemeta.h
|
||||
src/script/cpp_api/s_player.cpp
|
||||
src/script/cpp_api/s_player.h
|
||||
src/script/cpp_api/s_security.cpp
|
||||
src/script/cpp_api/s_security.h
|
||||
src/script/cpp_api/s_server.cpp
|
||||
src/script/cpp_api/s_server.h
|
||||
src/script/lua_api/l_areastore.cpp
|
||||
src/script/lua_api/l_base.cpp
|
||||
src/script/lua_api/l_base.h
|
||||
src/script/lua_api/l_client.cpp
|
||||
src/script/lua_api/l_craft.cpp
|
||||
src/script/lua_api/l_craft.h
|
||||
src/script/lua_api/l_env.cpp
|
||||
src/script/lua_api/l_env.h
|
||||
src/script/lua_api/l_http.cpp
|
||||
src/script/lua_api/l_http.h
|
||||
src/script/lua_api/l_internal.h
|
||||
src/script/lua_api/l_inventory.cpp
|
||||
src/script/lua_api/l_inventory.h
|
||||
src/script/lua_api/l_item.cpp
|
||||
src/script/lua_api/l_item.h
|
||||
src/script/lua_api/l_itemstackmeta.cpp
|
||||
src/script/lua_api/l_itemstackmeta.h
|
||||
src/script/lua_api/l_localplayer.cpp
|
||||
src/script/lua_api/l_mainmenu.cpp
|
||||
src/script/lua_api/l_mainmenu.h
|
||||
src/script/lua_api/l_mapgen.cpp
|
||||
src/script/lua_api/l_mapgen.h
|
||||
src/script/lua_api/l_metadata.cpp
|
||||
src/script/lua_api/l_minimap.cpp
|
||||
src/script/lua_api/l_nodemeta.cpp
|
||||
src/script/lua_api/l_nodemeta.h
|
||||
src/script/lua_api/l_nodetimer.cpp
|
||||
src/script/lua_api/l_noise.cpp
|
||||
src/script/lua_api/l_object.cpp
|
||||
src/script/lua_api/l_object.h
|
||||
src/script/lua_api/l_particles.cpp
|
||||
src/script/lua_api/l_particles.h
|
||||
src/script/lua_api/l_particles_local.cpp
|
||||
src/script/lua_api/l_rollback.cpp
|
||||
src/script/lua_api/l_rollback.h
|
||||
src/script/lua_api/l_server.cpp
|
||||
src/script/lua_api/l_settings.cpp
|
||||
src/script/lua_api/l_sound.cpp
|
||||
src/script/lua_api/l_storage.cpp
|
||||
src/script/lua_api/l_util.cpp
|
||||
src/script/lua_api/l_vmanip.cpp
|
||||
src/script/scripting_client.cpp
|
||||
src/script/scripting_client.h
|
||||
src/script/scripting_mainmenu.cpp
|
||||
src/script/scripting_mainmenu.h
|
||||
src/script/scripting_server.cpp
|
||||
src/script/scripting_server.h
|
||||
src/serialization.cpp
|
||||
src/serialization.h
|
||||
src/server.cpp
|
||||
src/serverenvironment.cpp
|
||||
src/serverenvironment.h
|
||||
src/server.h
|
||||
src/serverlist.cpp
|
||||
src/serverlist.h
|
||||
src/server/luaentity_sao.cpp
|
||||
src/server/player_sao.cpp
|
||||
src/server/serveractiveobject.cpp
|
||||
src/server/serveractiveobject.h
|
||||
src/settings.cpp
|
||||
src/settings.h
|
||||
src/settings_translation_file.cpp
|
||||
src/shader.cpp
|
||||
src/shader.h
|
||||
src/sky.cpp
|
||||
src/sound.cpp
|
||||
src/staticobject.cpp
|
||||
src/staticobject.h
|
||||
src/subgame.cpp
|
||||
src/subgame.h
|
||||
src/terminal_chat_console.cpp
|
||||
src/terminal_chat_console.h
|
||||
src/texture_override.cpp
|
||||
src/threading/atomic.h
|
||||
src/threading/event.cpp
|
||||
src/threading/mutex_auto_lock.h
|
||||
src/threading/mutex.cpp
|
||||
src/threading/mutex.h
|
||||
src/threading/semaphore.cpp
|
||||
src/threading/thread.cpp
|
||||
src/threading/thread.h
|
||||
src/threads.h
|
||||
src/tileanimation.cpp
|
||||
src/tileanimation.h
|
||||
src/tool.cpp
|
||||
src/tool.h
|
||||
src/translation.cpp
|
||||
src/unittest/test_areastore.cpp
|
||||
src/unittest/test_collision.cpp
|
||||
src/unittest/test_compression.cpp
|
||||
src/unittest/test_connection.cpp
|
||||
src/unittest/test.cpp
|
||||
src/unittest/test_filepath.cpp
|
||||
src/unittest/test.h
|
||||
src/unittest/test_inventory.cpp
|
||||
src/unittest/test_keycode.cpp
|
||||
src/unittest/test_map_settings_manager.cpp
|
||||
src/unittest/test_noderesolver.cpp
|
||||
src/unittest/test_noise.cpp
|
||||
src/unittest/test_random.cpp
|
||||
src/unittest/test_schematic.cpp
|
||||
src/unittest/test_serialization.cpp
|
||||
src/unittest/test_settings.cpp
|
||||
src/unittest/test_socket.cpp
|
||||
src/unittest/test_threading.cpp
|
||||
src/unittest/test_utilities.cpp
|
||||
src/unittest/test_voxelalgorithms.cpp
|
||||
src/unittest/test_voxelmanipulator.cpp
|
||||
src/util/areastore.cpp
|
||||
src/util/areastore.h
|
||||
src/util/auth.cpp
|
||||
src/util/auth.h
|
||||
src/util/base64.cpp
|
||||
src/util/base64.h
|
||||
src/util/basic_macros.h
|
||||
src/util/container.h
|
||||
src/util/directiontables.cpp
|
||||
src/util/directiontables.h
|
||||
src/util/enriched_string.cpp
|
||||
src/util/enriched_string.h
|
||||
src/util/md32_common.h
|
||||
src/util/numeric.cpp
|
||||
src/util/numeric.h
|
||||
src/util/pointedthing.cpp
|
||||
src/util/pointedthing.h
|
||||
src/util/pointer.h
|
||||
src/util/quicktune.h
|
||||
src/util/quicktune_shortcutter.h
|
||||
src/util/quicktune.cpp
|
||||
src/util/serialize.cpp
|
||||
src/util/serialize.h
|
||||
src/util/sha1.cpp
|
||||
src/util/srp.cpp
|
||||
src/util/srp.h
|
||||
src/util/strfnd.h
|
||||
src/util/string.cpp
|
||||
src/util/string.h
|
||||
src/util/thread.h
|
||||
src/util/timetaker.cpp
|
||||
src/util/timetaker.h
|
||||
src/version.cpp
|
||||
src/version.h
|
||||
src/voxelalgorithms.cpp
|
||||
src/voxelalgorithms.h
|
||||
src/voxel.cpp
|
||||
src/voxel.h
|
||||
src/wieldmesh.cpp
|
@@ -1,64 +0,0 @@
|
||||
#! /bin/bash
|
||||
|
||||
function setup_for_format() {
|
||||
if [ -z "${CLANG_FORMAT}" ]; then
|
||||
CLANG_FORMAT=clang-format
|
||||
fi
|
||||
echo "LINT: Using binary $CLANG_FORMAT"
|
||||
CLANG_FORMAT_WHITELIST="util/ci/clang-format-whitelist.txt"
|
||||
|
||||
files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h')"
|
||||
}
|
||||
|
||||
function check_format() {
|
||||
echo "Checking format..."
|
||||
|
||||
setup_for_format
|
||||
|
||||
local errorcount=0
|
||||
local fail=0
|
||||
for f in ${files_to_lint}; do
|
||||
d=$(diff -u "$f" <(${CLANG_FORMAT} "$f") || true)
|
||||
|
||||
if ! [ -z "$d" ]; then
|
||||
whitelisted=$(awk '$1 == "'$f'" { print 1 }' "$CLANG_FORMAT_WHITELIST")
|
||||
|
||||
# If file is not whitelisted, mark a failure
|
||||
if [ -z "${whitelisted}" ]; then
|
||||
errorcount=$((errorcount+1))
|
||||
|
||||
printf "The file %s is not compliant with the coding style" "$f"
|
||||
if [ ${errorcount} -gt 50 ]; then
|
||||
printf "\nToo many errors encountered previously, this diff is hidden.\n"
|
||||
else
|
||||
printf ":\n%s\n" "$d"
|
||||
fi
|
||||
|
||||
fail=1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$fail" = 1 ]; then
|
||||
echo "LINT reports failure."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "LINT OK"
|
||||
}
|
||||
|
||||
|
||||
|
||||
function fix_format() {
|
||||
echo "Fixing format..."
|
||||
|
||||
setup_for_format
|
||||
|
||||
for f in ${files_to_lint}; do
|
||||
whitelisted=$(awk '$1 == "'$f'" { print 1 }' "$CLANG_FORMAT_WHITELIST")
|
||||
if [ -z "${whitelisted}" ]; then
|
||||
echo "$f"
|
||||
$CLANG_FORMAT -i "$f"
|
||||
fi
|
||||
done
|
||||
}
|
@@ -1,5 +0,0 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
. ./util/ci/clang-format.sh
|
||||
|
||||
fix_format
|
Reference in New Issue
Block a user