From 1999a4caeba0745d87dabd532e0830c829516bca Mon Sep 17 00:00:00 2001
From: Griatch
aliases = ['l', 'ls']¶aliases = ['ls', 'l']¶
search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}¶search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}¶
aliases = ['pemit', 'remit']¶aliases = ['remit', 'pemit']¶
search_index_entry = {'aliases': 'pemit remit', 'category': 'admin', 'key': 'emit', 'no_prefix': ' pemit remit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶search_index_entry = {'aliases': 'remit pemit', 'category': 'admin', 'key': 'emit', 'no_prefix': ' remit pemit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶
aliases = ['batchcommand', 'batchcmd']¶aliases = ['batchcmd', 'batchcommand']¶
search_index_entry = {'aliases': 'batchcommand batchcmd', 'category': 'building', 'key': 'batchcommands', 'no_prefix': ' batchcommand batchcmd', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] <python.path.to.file>\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}¶search_index_entry = {'aliases': 'batchcmd batchcommand', 'category': 'building', 'key': 'batchcommands', 'no_prefix': ' batchcmd batchcommand', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] <python.path.to.file>\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}¶
aliases = ['@parent', '@type', '@update', '@swap', '@typeclasses']¶aliases = ['@update', '@type', '@swap', '@parent', '@typeclasses']¶
search_index_entry = {'aliases': '@parent @type @update @swap @typeclasses', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass parent type update swap typeclasses', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶search_index_entry = {'aliases': '@update @type @swap @parent @typeclasses', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass update type swap parent typeclasses', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶
aliases = ['@chan', '@channels']¶aliases = ['@channels', '@chan']¶
search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
aliases = ['@chan', '@channels']¶aliases = ['@channels', '@chan']¶
search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
aliases = ['l', 'ls']¶aliases = ['ls', 'l']¶
search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
aliases = ['emote', ':']¶aliases = [':', 'emote']¶
search_index_entry = {'aliases': 'emote :', 'category': 'general', 'key': 'pose', 'no_prefix': ' emote :', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶search_index_entry = {'aliases': ': emote', 'category': 'general', 'key': 'pose', 'no_prefix': ' : emote', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶
aliases = ['@task', '@delays']¶aliases = ['@delays', '@task']¶
search_index_entry = {'aliases': '@task @delays', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks task delays', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶search_index_entry = {'aliases': '@delays @task', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks delays task', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶
aliases = ['l', 'look']¶aliases = ['look', 'l']¶
search_index_entry = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' l look', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶search_index_entry = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' look l', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶
aliases = ['?', 'h']¶aliases = ['h', '?']¶
search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
aliases = [':s', ':i', ':A', ':f', ':uu', ':fd', ':y', '::', ':', ':dd', ':DD', ':<', ':wq', ':j', ':!', ':p', ':q!', ':u', ':echo', ':r', ':fi', ':S', ':h', ':I', ':x', ':=', ':UU', ':w', ':q', ':>', ':::', ':dw']¶aliases = [':S', ':echo', ':q!', ':fd', ':u', ':=', ':p', '::', ':', ':r', ':uu', ':j', ':DD', ':h', ':y', ':wq', ':UU', ':x', ':>', ':::', ':dd', ':A', ':w', ':i', ':I', ':f', ':dw', ':<', ':fi', ':s', ':!', ':q']¶
search_index_entry = {'aliases': ':s :i :A :f :uu :fd :y :: : :dd :DD :< :wq :j :! :p :q! :u :echo :r :fi :S :h :I :x := :UU :w :q :> ::: :dw', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :s :i :A :f :uu :fd :y :: : :dd :DD :< :wq :j :! :p :q! :u :echo :r :fi :S :h :I :x := :UU :w :q :> ::: :dw', 'tags': '', 'text': '\n Commands for the editor\n '}¶search_index_entry = {'aliases': ':S :echo :q! :fd :u := :p :: : :r :uu :j :DD :h :y :wq :UU :x :> ::: :dd :A :w :i :I :f :dw :< :fi :s :! :q', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :S :echo :q! :fd :u := :p :: : :r :uu :j :DD :h :y :wq :UU :x :> ::: :dd :A :w :i :I :f :dw :< :fi :s :! :q', 'tags': '', 'text': '\n Commands for the editor\n '}¶
aliases = ['y', 'abort', 'a', '__nomatch_command', 'yes', 'n', 'no']¶
search_index_entry = {'aliases': 'y abort a __nomatch_command yes n no', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' y abort a __nomatch_command yes n no', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
aliases = ['end', 'n', 'q', 'quit', 'previous', 'next', 'e', 'top', 't', 'abort', 'a', 'p']¶aliases = ['quit', 'next', 'q', 'previous', 'p', 'abort', 'top', 'a', 'end', 't', 'e', 'n']¶
search_index_entry = {'aliases': 'end n q quit previous next e top t abort a p', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' end n q quit previous next e top t abort a p', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶search_index_entry = {'aliases': 'quit next q previous p abort top a end t e n', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' quit next q previous p abort top a end t e n', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
Version control software allows you to track the changes you make to your code, as well as being -able to easily backtrack these changes, share your development efforts and more. Even if you are not -contributing to Evennia itself, and only wish to develop your own MU* using Evennia, having a -version control system in place is a good idea (and standard coding practice). For an introduction -to the concept, start with the Wikipedia article -here. Evennia uses the version control system -Git and this is what will be covered henceforth. Note that this page also -deals with commands for Linux operating systems, and the steps below may vary for other systems, -however where possible links will be provided for alternative instructions.
+able to easily backtrack these changes, share your development efforts and more. +It’s strongly recommended that you put your game code under version control. Version +control is also the way to contribue to Evennia itself.
+For an introduction to the concept, start with the Wikipedia article +here. Evennia uses the version +control system Git and this is what will be covered +henceforth. Note that this page primarily shows commands for Linux, but the +syntax should be the same for Windows and Mac.
For more help on using Git, please refer to the Official GitHub documentation.
If you have gotten Evennia installed, you will have Git already and can skip to Step 2 below. -Otherwise you will need to install Git on your platform. You can find expanded instructions for +
You can find expanded instructions for installation here.
Fedora Linux
- yum install git-core
+ yum install git-core
Debian Linux (Ubuntu, Linux Mint, etc.)
- apt-get install git
+ apt-get install git
@@ -112,301 +111,328 @@ real, full name online, put a nickname here.
git init mygame
-Your mygame folder is now ready for version control! Now add all the content and make a first
+
Your mygame folder is now ready for version control! Add all the content and make a first
commit:
cd mygame
git add *
-git commit -m "Initial commit"
+git commit -a -m "Initial commit"
-Read on for help on what these commands do.
+In turn these commands:
+Move us into the mygame folder
Tell git that everything * means everything) in this folder should be put
+under version control.
Commit all (-a) those newly added files to git and add a message -m so you remember
+what you did at this point. Doing a commit is like saving a snapshot of the
+current state of everything.
Read on for details!
When working on your code or fix bugs in your local branches you may end up creating new files. If -you do you must tell Git to track them by using the add command:
-git add <filename>
+you do you must tell Git to track them by using the add command.
+git add <filename>
-You can check the current status of version control with git status. This will show if you have
-any modified, added or otherwise changed files. Some files, like database files, logs and temporary
-PID files are usually not tracked in version control. These should either not show up or have a
-question mark in front of them.
-
-
-Controlling tracking¶
-You will notice that some files are not covered by your git version control, notably your settings
-file (mygame/server/conf/settings.py) and your sqlite3 database file mygame/server/evennia.db3.
-This is controlled by the hidden file mygame/.gitignore. Evennia creates this file as part of the
-creation of your game directory. Everything matched in this file will be ignored by GIT. If you want
-to, for example, include your settings file for collaborators to access, remove that entry in
-.gitignore.
-
-Note: You should never put your sqlite3 database file into git by removing its entry in
-.gitignore. GIT is for backing up your code, not your database. That way lies madness and a good
-chance you’ll confuse yourself so that after a few commits and reverts don’t know what is in your
-database or not. If you want to backup your database, do so by simply copying the file on your hard
-drive to a backup-name.
-
+You only need to do this once per file.
+git status
+
+
+will show if you have any modified, added or otherwise changed files. Some
+files, like database files, logs and temporary PID files are usually not
+tracked in version control. These should either not show up or have a question
+mark in front of them.
+
+Note
+You will notice that some files are not covered by your git version control,
+notably your settings file (mygame/server/conf/settings.py) and your sqlite3
+database file mygame/server/evennia.db3. What is auto-ignored by is controlled
+by the hidden file mygame/.gitignore. Evennia creates this file as part of
+the creation of your game directory. Everything matched in this file will be
+ignored by git. If you want to, for example, include your settings file for
+collaborators to access, remove that entry in .gitignore.
+
+
+Warning
+You should never put your sqlite3 database file into git by removing its entry
+in .gitignore. GIT is for backing up your code, not your database. That way
+lies madness and a good chance you’ll confuse yourself so that after a few
+commits and reverts don’t know what is in your database or not. If you want to
+backup your database, do so by simply copying the file on your hard drive to a
+backup-name.
+
Committing your Code¶
-
-Committing means storing the current snapshot of your code within git. This creates a “save point”
-or “history” of your development process. You can later jump back and forth in your history, for
-example to figure out just when a bug was introduced or see what results the code used to produce
-compared to now.
-
-It’s usually a good idea to commit your changes often. Committing is fast and local only - you will
-never commit anything online at this point. To commit your changes, use
-git commit --all
+Committing your code means storing the current snapshot of your code within
+git. This creates a “save point” or “history” of your development process. You
+can later jump back and forth in your history, for example to figure out just
+when a bug was introduced or see what results the code used to produce compared
+to now. Or just wiping everything since the last commit, if you did something
+stupid.
+It’s usually a good idea to commit your changes often. Committing is fast and
+local only - you will never commit anything online at this point. To commit your
+changes, use
+git commit --all
-This will save all changes you made since last commit. The command will open a text editor where you
-can add a message detailing the changes you’ve made. Make it brief but informative. You can see the
-history of commits with git log. If you don’t want to use the editor you can set the message
-directly by using the -m flag:
-git commit --all -m "This fixes a bug in the combat code."
+Also -a works. This will open a text editor for you to describe your change.
+Be brief but informative in your message - you’ll appreciate it later. When you
+save and close the editor, the commit will be saved. You can create the message
+directly with
+git commit -a -m "This fixes a bug in the combat code."
Changing your mind¶
-If you have non-committed changes that you realize you want to throw away, you can do the following:
-git checkout <file to revert>
+If you have non-committed changes that you realize you want to throw away, you
+‘check out’ the file you want - this will re-load it from the last committed
+state:
+git checkout <file_to_revert>
+git checkout foo/bar/dummy.py
-This will revert the file to the state it was in at your last commit, throwing away the changes
-you did to it since. It’s a good way to make wild experiments without having to remember just what
-you changed. If you do git checkout . you will throw away all changes since the last commit.
+If you want to revert all changes you did since last commit, do
+git checkout .
+
+
+(that is, add a single . at the end).
Pushing your code online¶
-So far your code is only located on your private machine. A good idea is to back it up online. The
-easiest way to do this is to push it to your own remote repository on GitHub.
+So far your code is only located on your private machine. A good idea is to back
+it up online. The easiest way to do this is to push it to your own remote
+repository on GitHub.
+
+Important
+Just to avoid confusion, be aware that Github’s documentation has changed to
+calling the primary branch ‘main’ rather than ‘master’. While Evennia still
+uses ‘master’ branch (and this is what we refer to below), you can use either
+name for your personal primary branch - they are equivalent.
+
-Make sure you have your game directory setup under git version control as described above. Make
-sure to commit any changes.
+Make sure you have your game directory setup under git version control as
+described in the previous section. Make sure to commit any changes you did.
Create a new, empty repository on Github. Github explains how
-here (do not “Initialize the repository with a
-README” or else you’ll create unrelated histories).
-From your local game dir, do git remote add origin <github URL> where <github URL> is the URL
-to your online repo. This tells your game dir that it should be pushing to the remote online dir.
+here (do not “Initialize
+the repository with a README” or else you’ll create unrelated histories).
+From your local game dir, do git remote add origin <github URL> where
+<github URL> is the URL to your online repo. This tells your game dir that
+it should be pushing to the remote online dir.
git remote -v to verify the online dir.
-git push origin master now pushes your game dir online so you can see it on github.com.
+git push origin master (or git push origin main) now pushes your game dir
+online so you can see it on github.com.
-You can commit your work locally (git commit --all -m "Make a change that ...") as many times as
-you want. When you want to push those changes to your online repo, you do git push. You can also
-git clone <url_to_online_repo> from your online repo to somewhere else (like your production
-server) and henceforth do git pull to update that to the latest thing you pushed.
-Note that GitHub’s repos are, by default publicly visible by all. Creating a publicly visible online
-clone might not be what you want for all parts of your development process - you may prefer a more
-private venue when sharing your revolutionary work with your team. If that’s the case you can change
-your repository to “Private” in the github settings. Then your code will only be visible to those
-you specifically grant access.
+You can commit your work locally (git commit --all -m "Make a change that ...") as many times as you want. When you want to push those changes to your
+online repo, you do git push. You can also git clone <url_to_online_repo>
+from your online repo to somewhere else (like your production server) and
+henceforth do git pull to update that to the latest thing you pushed.
+Note that GitHub’s repos are, by default publicly visible by all. Creating a
+publicly visible online clone might not be what you want for all parts of your
+development process - you may prefer a more private venue when sharing your
+revolutionary work with your team. If that’s the case you can change your
+repository to “Private” in the github settings. Then your code will only be
+visible to those you specifically grant access.
Forking Evennia¶
-This helps you set up an online fork of Evennia so you can easily commit fixes and help with
-upstream development.
+This helps you set up an online fork of the main Evennia repository so you can
+easily commit fixes and help with upstream development. You can do this step
+also if you didn’t put your game dir under version control like in the
+previous section - the evennia repo and your game dir repo are completely
+separate.
Step 1: Fork the evennia/master repository¶
-Before proceeding with the following step, make sure you have registered and created an account on
-GitHub.com. This is necessary in order to create a fork of Evennia’s master
-repository, and to push your commits to your fork either for yourself or for contributing to
+
Before proceeding with the following step, make sure you have registered and
+created an account on GitHub.com. This is necessary in order to create a fork
+of Evennia’s master repository, and to push your commits to your fork either for
+yourself or for contributing to
Evennia.
-A fork is a clone of the master repository that you can make your own commits and changes to. At
-the top of this page, click the “Fork” button, as it appears
-below. 
+A fork is a clone of the master repository that you can make your own commits
+and changes to. At the top of this page,
+click the “Fork” button, as it appears below.
+
-
-Step 2: Clone your fork¶
-The fork only exists online as of yet. In a terminal, change your directory to the folder you wish
-to develop in. From this directory run the following command:
-git clone https://github.com/yourusername/evennia.git
+
+Step 2: Clone your online fork of Evennia¶
+The fork only exists online as of yet. In a terminal, change your directory to
+the folder you wish to develop in. From this directory run the following
+command:
+git clone https://github.com/yourusername/evennia.git
-This will download your fork to your computer. It creates a new folder evennia/ at your current
-location.
+This will download your fork to your computer. It creates a new folder
+evennia/ at your current location.
Step 3: Configure remotes¶
-A remote is a repository stored on another computer, in this case on GitHub’s server. When a
-repository is cloned, it has a default remote called origin. This points to your fork on GitHub,
-not the original repository it was forked from. To easily keep track of the original repository
-(that is, Evennia’s official repository), you need to add another remote. The standard name for this
-remote is “upstream”.
-Below we change the active directory to the newly cloned “evennia” directory and then assign the
-original Evennia repository to a remote called “upstream”:
-cd evennia
-git remote add upstream https://github.com/evennia/evennia.git
+Your Evennia-fork is now separate from upstream, ‘official’ Evennia. You will
+want to set it up so that you can easily sync our updates and changes to your
+fork.
+We do this by setting up a new remote. We actually already have one remote,
+that is our own github form of Evennia. This got created when you cloned the
+repo and defaults to being called origin.
+We will now create a new remote called upstream.
+cd evennia
+git remote add upstream https://github.com/evennia/evennia.git
-If you also want to access Evennia’s develop branch (the bleeding edge development branch) do the
-following:
-git fetch upstream develop
-git checkout develop
+This adds a remote to the main evennia repo.
+If you also want to access Evennia’s develop branch (the bleeding edge
+development) do the following:
+git fetch upstream develop
+git checkout develop
-You should now have the upstream branch available locally. You can use this instead of master
-below if you are contributing new features rather than bug fixes.
+Use
+git checkout master
+git checkout develop
+to switch between the branches. If you want to contribute a fix, ask first which
+branch to use. Normally master is for bug fixes and develop is for new
+features, but late in the development of a new Evennia version, all changes
+often go into develop.
-
-Working with your fork¶
-
-A branch is a separate instance of your code. Changes you do to code in a branch does not affect
-that in other branches (so if you for example add/commit a file to one branch and then switches to
-another branch, that file will be gone until you switch back to the first branch again). One can
-switch between branches at will and create as many branches as one needs for a given project. The
-content of branches can also be merged together or deleted without affecting other branches. This is
-not only a common way to organize development but also to test features without messing with
-existing code.
-
-The default branch of git is called the “master” branch. As a rule of thumb, you should never
-make modifications directly to your local copy of the master branch. Rather keep the master clean
-and only update it by pulling our latest changes to it. Any work you do should instead happen in a
-local, other branches.
-
-Making a work branch¶
-git checkout -b myfixes
+
+Working with your Evennia fork¶
+Branches are stand-alone editions of the same code. You make a commit to a
+branch. Switching to a branch will change the code on-disk. You can easily
+make a new branch off a parent branch, and then merge it back into the same
+branch later (or throw it away). This is a very common way to work on new
+features in safety and isolation.
+
+Updating to latest Evennia¶
+When Evennia’s official repository updates, first make sure to commit all your
+changes to your branch and then checkout the “clean” master branch:
+git checkout master
+git pull upstream master
-This command will checkout and automatically create the new branch myfixes on your machine. If you
-stared out in the master branch, myfixes will be a perfect copy of the master branch. You can see
-which branch you are on with git branch and change between different branches with git checkout <branchname>.
-Branches are fast and cheap to create and manage. It is common practice to create a new branch for
-every bug you want to work on or feature you want to create, then create a pull request for that
-branch to be merged upstream (see below). Not only will this organize your work, it will also make
-sure that your master branch version of Evennia is always exactly in sync with the upstream
-version’s master branch.
+Or, if you are working against Evennia’s development branch:
+git checkout develop
+git pull upstream develop
+
+
+The pull command will fetch all the changes from the “upstream” remote and
+merge it into your local master/develop branch. It should now be a perfect copy
+of the latest Evennia changes.
-
-Updating with upstream changes¶
-When Evennia’s official repository updates, first make sure to commit all your changes to your
-branch and then checkout the “clean” master branch:
-git commit --all
-git checkout master
+
+Making changes¶
+As a rule of thumb you should never work directly in Evennia’s master or
+develop branches. Instead you make a new branch off the branch you want
+and change that.
+git checkout master (or develop)
+check checkout -b strange_bug
-Pull the latest changes from upstream:
-git pull upstream master
+You now have a new branch strange_bug that is an exact replica of the branch you
+had checked out when you created it. Here you can now make your own
+modifications.
+git branches
-This should sync your local master branch with upstream Evennia’s master branch. Now we go back to
-our own work-branch (let’s say it’s still called “myfixes”) and merge the updated master into our
-branch.
-git checkout myfixes
-git merge master
+will show you which branches are available and which one you are currently
+using. Use git checkout <branch> to move between them, but remember to commit
+your changes before you do.
+You often want to make sure also your work-branch has the latest upstream
+changes. To do this, you need to first update your copy of the
+master/develop branch and then merge those changes into your work branch.
+Make sure you have committed everything first!
+git commit -a -m "My latest changes ..." # on your strange_bug branch
+git checkout master (or develop)
+git pull upstream develop
+git checkout strange_bug
+git merge master (or develop)
-If everything went well, your myfixes branch will now have the latest version of Evennia merged
-with whatever changes you have done. Use git log to see what has changed. You may need to restart
-the server or run manage.py migrate if the database schema changed (this will be seen in the
-commit log and on the mailing list). See the Git manuals for
-learning more about useful day-to-day commands, and special situations such as dealing with merge
-collisions.
+If everything went well, your strange_bug branch will now have the latest version
+of Evennia merged with whatever changes you have done.
+Now work away on your code and commit with reasonable commit messages
+git commit -a -m "Fixed the issue in ..."
+git commit -a -m "Adding unit tests. This resolves #123."
+
+
+Use
+git diff
+
+
+to see what you changed since last commit, and
+git log
+
+
+to see past commits (including those made by Evennia upstream, remember that
+your branch is a copy of the upstream one, including its history!)
-