# from [d4ff673e1080a7b081d79a1876a6bb203d05640d] # to [33895c7883416f107f9c0174fb16c16b1b1db81d] # # patch "automate_ostream_demuxed.hh" # from [d5e068c3a9dadfabf27db883b6a2bb2379eea34e] # to [cf23c94fe10bf23a627f1bc8b6ecda2c31a179b0] # # patch "util/mtnopt.in" # from [f35d29ef8d033798552ca96e218ce5db2d443353] # to [f93b50aaa2cd6a7e8f2d9a909d5d450788120a5c] # # old_revision [540a47450b94af191c14a9f67b296419d2201c16] # # patch "NEWS" # from [6e3e6da62d64faad64bca48dab6ad10093feea90] # to [55ff871e35f066a5b22a96d99e45136f8e790248] # # patch "cmd.cc" # from [cd917e32e1047fb44b15595b16506452592d8865] # to [09579b285b88ef6c3c5d248d7bb73a0a103850f9] # # patch "globish.cc" # from [1a7b2b42320d0c8d8fde56b5af871bc125d17a5a] # to [23f857decc878f3aa3b87fb9b45eacb69180d6f8] --- +++ @@ -0,0 +1,154 @@ +// Copyright (C) 2005 and later by various people +// see monotone commit logs for details and authors +// +// This program is made available under the GNU GPL version 2.0 or +// greater. See the accompanying file COPYING for details. +// +// This program is distributed WITHOUT ANY WARRANTY; without even the +// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +// PURPOSE. + +#ifndef __AUTOMATE_OSTREAM_HH__ +#define __AUTOMATE_OSTREAM_HH__ + +#include +#include +#include "lexical_cast.hh" + +using boost::lexical_cast; + +template > +class basic_automate_streambuf : public std::basic_streambuf<_CharT, _Traits> +{ + typedef _Traits traits_type; + typedef typename _Traits::int_type int_type; + size_t _bufsize; + std::basic_ostream<_CharT, _Traits> *out; + int cmdnum; + +public: + basic_automate_streambuf(std::ostream & o, size_t bufsize) + : std::basic_streambuf<_CharT, _Traits>(), _bufsize(bufsize), out(&o), cmdnum(0) + { + _CharT *inbuf = new _CharT[_bufsize]; + this->setp(inbuf, inbuf + _bufsize); + } + + basic_automate_streambuf() + {} + + ~basic_automate_streambuf() + {} + + void end_cmd(int errcode) + { + _M_sync(); + write_out_of_band('l', lexical_cast(errcode)); + ++cmdnum; + } + + virtual int sync() + { + _M_sync(); + return 0; + } + + void _M_sync() + { + if (!out) + { + this->setp(this->pbase(), this->pbase() + _bufsize); + return; + } + int num = this->pptr() - this->pbase(); + if (num) + { + (*out) << cmdnum << ':' + << 'm' << ':' + << num << ':' + << std::basic_string<_CharT,_Traits>(this->pbase(), num); + this->setp(this->pbase(), this->pbase() + _bufsize); + out->flush(); + } + } + + void write_out_of_band(char type, std::string const & data) + { + unsigned chunksize = _bufsize; + size_t length = data.size(), offset = 0; + do + { + if (offset+chunksize>length) + chunksize = length-offset; + (*out) << cmdnum << ':' << type << ':' << chunksize + << ':' << data.substr(offset, chunksize); + offset+= chunksize; + } while (offsetflush(); + } + + void write_headers(std::vector > const & headers) + { + for (std::vector >::const_iterator h = headers.begin(); + h != headers.end(); ++h) + { + (*out) << h->first << ": " << h->second << '\n'; + } + (*out) << '\n'; + out->flush(); + } + + int_type + overflow(int_type c = traits_type::eof()) + { + sync(); + this->sputc(c); + return 0; + } +}; + +template > +struct basic_automate_ostream : public std::basic_ostream<_CharT, _Traits> +{ + typedef basic_automate_streambuf<_CharT, _Traits> streambuf_type; + streambuf_type _M_autobuf; + + basic_automate_ostream(std::basic_ostream<_CharT, _Traits> &out, + size_t blocksize) + : std::basic_ostream<_CharT, _Traits>(&_M_autobuf), + _M_autobuf(out, blocksize) + { /* this->init(&_M_autobuf); */ } + +protected: + basic_automate_ostream() { } +public: + + virtual ~basic_automate_ostream() + {} + + streambuf_type * + rdbuf() const + { return const_cast(&_M_autobuf); } + + virtual void end_cmd(int errcode) + { _M_autobuf.end_cmd(errcode); } + + virtual void write_out_of_band(char type, std::string const & data) + { _M_autobuf.write_out_of_band(type, data); } + + virtual void write_headers(std::vector > const & headers) + { _M_autobuf.write_headers(headers); } +}; + +typedef basic_automate_streambuf automate_streambuf; +typedef basic_automate_ostream automate_ostream; + +#endif + +// Local Variables: +// mode: C++ +// fill-column: 76 +// c-file-style: "gnu" +// indent-tabs-mode: nil +// End: +// vim: et:sw=2:sts=2:ts=2:cino=>2s,{s,\:s,+s,t0,g0,^-2,e-2,n-2,p2s,(0,=s: --- automate_ostream_demuxed.hh +++ automate_ostream_demuxed.hh @@ -0,0 +1,156 @@ +// Copyright (C) 2009 and later by various people +// see monotone commit logs for details and authors +// +// This program is made available under the GNU GPL version 2.0 or +// greater. See the accompanying file COPYING for details. +// +// This program is distributed WITHOUT ANY WARRANTY; without even the +// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +// PURPOSE. + +#ifndef __AUTOMATE_OSTREAM_DEMUXED_HH__ +#define __AUTOMATE_OSTREAM_DEMUXED_HH__ + +#include + +#include "automate_ostream.hh" +#include "simplestring_xform.hh" + +template > +class basic_automate_streambuf_demuxed : public std::basic_streambuf<_CharT, _Traits> +{ + typedef _Traits traits_type; + typedef typename _Traits::int_type int_type; + size_t _bufsize; + std::basic_ostream<_CharT, _Traits> *mystdout; + std::basic_ostream<_CharT, _Traits> *errout; +public: + basic_automate_streambuf_demuxed(std::ostream & out, std::ostream & err, + size_t bufsize) : + std::basic_streambuf<_CharT, _Traits>(), + _bufsize(bufsize), + mystdout(&out), + errout(&err) + { + _CharT * inbuf = new _CharT[_bufsize]; + this->setp(inbuf, inbuf + _bufsize); + } + + ~basic_automate_streambuf_demuxed() { } + + void end_cmd() + { + _M_sync(); + } + + virtual int sync() + { + _M_sync(); + return 0; + } + + void write_out_of_band(char type, std::string const & data) + { + // FIXME: ignore tickers, because we'd have to track their state + // here and they would pollute the output too much anyways + if (type == 't') + return; + + std::string out; + i18n_format prefix; + if (type == 'w') + prefix = F("%s: remote warning: ") % prog_name; + else if (type == 'e') + prefix = F("%s: remote error: ") % prog_name; + else if (type == 'p') + prefix = F("%s: remote message: ") % prog_name; + else + I(false); + + prefix_lines_with(prefix.str(), data, out); + (*errout) << out << std::endl; + } + + void write_headers(std::vector > const & headers) + { + i18n_format prefix = F("%s: remote header: ") % prog_name; + for (std::vector >::const_iterator h = headers.begin(); + h != headers.end(); ++h) + { + (*errout) << prefix.str() << h->first << ": " << h->second << std::endl; + } + } + + int_type overflow(int_type c = traits_type::eof()) + { + sync(); + this->sputc(c); + return 0; + } +private: + void _M_sync() + { + if (!mystdout) + { + this->setp(this->pbase(), this->pbase() + _bufsize); + return; + } + int num = this->pptr() - this->pbase(); + if (num) + { + (*mystdout) << std::basic_string<_CharT, _Traits>(this->pbase(), num); + this->setp(this->pbase(), this->pbase() + _bufsize); + mystdout->flush(); + } + } +}; + +template > +struct basic_automate_ostream_demuxed : public basic_automate_ostream<_CharT, _Traits> +{ + typedef basic_automate_streambuf_demuxed<_CharT, _Traits> streambuf_type; + streambuf_type _M_autobuf; + int errcode; + +public: + basic_automate_ostream_demuxed(std::basic_ostream<_CharT, _Traits> &out, + std::basic_ostream<_CharT, _Traits> &err, + size_t blocksize) + : _M_autobuf(out, err, blocksize) + { this->init(&_M_autobuf); } + + virtual ~basic_automate_ostream_demuxed() + {} + + streambuf_type * + rdbuf() const + { return const_cast(&_M_autobuf); } + + virtual void end_cmd(int error) + { + errcode = error; + _M_autobuf.end_cmd(); + } + + int get_error() const + { return errcode; } + + virtual void write_out_of_band(char type, std::string const & data) + { _M_autobuf.write_out_of_band(type, data); } + + virtual void write_headers(std::vector > const & headers) + { _M_autobuf.write_headers(headers); } +}; + +typedef basic_automate_streambuf_demuxed automate_streambuf_demuxed; +typedef basic_automate_ostream_demuxed automate_ostream_demuxed; + +#endif + +// Local Variables: +// mode: C++ +// fill-column: 76 +// c-file-style: "gnu" +// indent-tabs-mode: nil +// End: +// vim: et:sw=2:sts=2:ts=2:cino=>2s,{s,\:s,+s,t0,g0,^-2,e-2,n-2,p2s,(0,=s: --- util/mtnopt.in +++ util/mtnopt.in @@ -0,0 +1,85 @@ +#! /bin/sh +# Copyright (C) 2008 Richard Levitte +# +# This program is made available under the GNU GPL version 2.0 or +# greater. See the accompanying file COPYING for details. +# +# This program is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. + +mtn_dir=. +mtn_keys= +shell_type=sh +if echo $SHELL | grep '/t?csh' > /dev/null; then shell_type=csh; fi +values_only=false + +usage () { + echo "mtnopt: Usage: mtnopt [-c] [-s] [-d dir] [-k keys] [-v] [-h]" +} +while [ ! $# = 0 ]; do + case $1 in + -c) + shell_type=csh + ;; + -s) + shell_type=sh + ;; + -d*) + mtn_dir=`echo "$1" | sed -e 's/^-d//'` + if [ -z "$mtn_dir" ]; then shift; mtn_dir="$1"; fi + if [ -z "$mtn_dir" ]; then + echo "mtnopt: missing required argument for -d" >&2 + usage + exit 1 + fi + ;; + -k*) + mtn_keys=`echo "$1" | sed -e 's/^-k//'` + if [ -z "$mtn_keys" ]; then shift; mtn_keys="$1"; fi + if [ -z "$mtn_keys" ]; then + echo "mtnopt: missing required argument for -k" >&2 + usage + exit 1 + fi + ;; + -v) + values_only=true + ;; + -h|--help) + usage + exit 0 + ;; + --version) + echo "mtnopt from monotone @PACKAGE_VERSION@" + exit 0 + ;; + esac + shift +done + +if [ ! -d "$mtn_dir" ]; then + echo "mtnopt: $mtn_dir isn't a directory or is missing" + exit 1 +elif [ ! -d "$mtn_dir/_MTN" ]; then + echo "mtnopt: $mtn_dir isn't a monotone workspace" + exit 1 +elif [ ! -f "$mtn_dir/_MTN/options" ]; then + echo "mtnopt: $mtn_dir/_MTN/options isn't a file or is missing" + exit 1 +fi + +cat $mtn_dir/_MTN/options | while read L; do + eval `echo "$L" | sed -e 's/^ *\([a-z][a-z]*\) \(.*\)$/key=\1; val=\2/'` + if [ -z "$mtn_keys" ] || echo "$key" | egrep "^$mtn_keys\$" > /dev/null; then + if $values_only; then + echo "$val" + else + if [ "$shell_type" = sh ]; then + echo "MTN_$key=\"$val\";" + else + echo "set MTN_$key=\"$val\";" + fi + fi + fi +done --- NEWS +++ NEWS @@ -0,0 +1,3386 @@ +Xxx Xxx 99 99:99:99 UTC 2010 + + 0.99 release. + + Changes + + - Selectors are much more powerful now, and the characters '(', + ')', and ';' need to be quoted if mean literally (just like + '/'). See section 3.2 in the documentation for details. + (fixes monotone bug #18302). + + - The command 'db kill_rev_locally' has been renamed to + 'local kill_revision', and 'db kill_tag_locally' and + 'db kill_branch_certs_locally' have been replaced with a more + flexible command 'local kill_certs'. + + - The 'cert' command can now operate on multiple revisions at once. + + - The SERVER [BRANCH] call syntax for network-related commands + has been deprecated in favour of the existing, universal + URI syntax. Additionally, file:// and ssh:// URIs are now + parsed for include and exclude patterns just as the native + mtn:// URIs. + + The possibility to specify include patterns by using + 'include=' and exclude patterns by using 'exclude=' + in the query string has been removed. + + Monotone's native protocol (mtn://) is still the default + protocol if nothing is specified. + + The format for the server part of the 'default-server', + 'known-server', 'server-include' and 'server-exclude' + database variables has been changed and now always includes + the complete (normalized) URI resource, consisting of the + used protocol, user, host, port and path parts. Older entries + in existing databases which do not match the new format are + preserved and not changed by monotone. + + Please check the manual section 5.3 for more details on the + URI syntax. + + - Naturally, the 'clone' command now also accepts mtn:// URIs, + though the use of branch globs is forbidden unless a branch is + specified separately with the new --branch option. + + To avoid confusion with an existing workspace, clone no longer + looks for and loads the options of such a workspace, therefor + it now also falls back to the configured default database and + no longer to the database used in the workspace if no explicit + database is given. + + - Server defaults for netsync operations are now only saved if + the exchange was successful. The progress messages which have + been issued for this previously have been removed, since they + would come up now unexpectedly and would clutter the output of + commands such as 'clone', 'automate remote' and + 'automate remote_stdio'. + + - The following characters have been deprecated in branch names + + ?,*%+{}[]!^ + + as they denote either meta characters in monotone's URI syntax + or are used in globs to resolve branch patterns. + Furthermore, branch names should no longer start with a dash + (-), since this character is used to denote an exclude pattern + in the aforementioned URI syntax. + + monotone warns on the creation of branches which violate these + restrictions and gives further directions. + + - The 'import' command now keeps the created bookkeeping root if + --dry-run is not specified. This makes it possible to re-use + the import directory as workspace and is also more closely + to what our documentation states, when it says that import + is basically "setup with a twist". + + - monotone no longer passes syntactically correct, but non-existent + revision ids through the selector machinery. The most visible + place for this change is 'automate select', which no longer + echoes every possible 40 hex-byte string. + + New features + + - Options can now be overridden; you can specify --no-unknown + --unknown on the command line. Similarly, you can specify + --no-unknown in the get_default_command_options hook, then + change it to --unknown on the command line. + + - New global options: + --no-ignore-suspend-certs undo previous --ignore-suspend-certs + --use-default-key undo previous --key + --allow-default-confdir undo previous --no-default-confdir + --allow-workspace undo previous --no-workspace + --interactive undo previous --non-interactive + --no-standard-rcfiles replaces --norc + --standard-rcfiles undo previous --no-standard-rcfiles + --no-builtin-rcfile replaces --nostd + --builtin-rcfile undo previous --no-builtin-rcfile + --clear-rcfiles undo previous --rcfile + --verbose [-v] increase verbosity (opposite of --quiet) + + - Global options now hidden: + --roster-cache-performance-log + + - New command options: + add + --no-recursive undo previous --recursive + --respect-ignore undo previous --no-respect-ignore + --no-unknown undo previous --unknown + bisect *, checkout, pivot_root, pluck, update, automate update + --no-move-conflicting-paths undo previous --move-conflicting-paths + diff + --without-header undo previous --with-header + --show-encloser undo previous --show-encloser + disapprove, suspend + --no-update undo previous --update + drop + --no-recursive undo previous --recursive + explicit_merge, merge, merge_into_dir propagate + --no-resolve-conflicts undo previous --resolve-conflicts + --no-update undo previous --update + log + --no-brief undo previous --brief + --no-diffs undo previous --diffs + --clear-from undo previous --from + --files undo previous --no-files + --graph undo previous --no-graph + --merges undo previous --no-merges + --clear-to undo previous --to + import + --no-dry-run undo previous --dry-run + --respect-ignore undo previous --no-respect-ignore + mkdir + --respect-ignore undo previous --no-respect-ignore + serve + --no-pid-file undo previous --pid-file + + sync, pull, push, automate remote_stdio, automate remote + automate pull, automate push, automate sync + --no-set-default undo previous --set-default + + automate inventory + --corresponding-renames undo previous --no-corresponding-renames + --ignored undo previous --no-ignored + --unchanged undo previous --no-unchanged + --unknown undo previous --no-unknown + + automate content_diff + --without-header undo previous --with-header + + automate show_conflicts + --no-ignore-suspend-certs undo previous --ignore-suspend-certs + + automate log + --clear-from undo previous --from + --merges undo previous --no-merges + --clear-to undo previous --to + + - Command options now hidden: + (several commands) --no-prefix + serve --stdio --no-transport-auth + (all netsync/remote commands) --min-netsync-version --max-netsync-version + + - Deprecated options: + --norc use --no-standard-rcfiles + --nostd use --no-builtin-rcfile + --reallyquiet use --quiet --quiet + --debug use --verbose + + - To aid command line typing, partial option names are tried to + be expanded; if the expansion leads to multiple possibilities, + all matches and an accompanying short description of the + particular expansion are displayed. + + - The 'disapprove' command now accepts a revision range in + addition to a single revision. + + - New 'k:' selector type to query revisions where at least one + certificate was signed with the given key. + + - New automation command 'log' which behaves identical to the + normal 'log' command, except that it only outputs the + revision ids. + + Bugs fixed + + - The 'mv' command now warns when a source is being renamed onto + itself or one of its children (fixes monotone bug #29484). + + - The 'mv' command now handles this usage properly, where + 'foo' is a directory: + mv foo bar + mtn mv --bookkeep-only foo bar + + - monotone no longer asks to pick a branch from a set of branches + of a revision in which all but one branch have been suspended + (fixes monotone bug #29843) + + - The annotate command no longer fails if it should print out + empty or untrusted date cert values + (fixes monotone bug #30150) + + - A globish that ended with a bracket pair with an empty branch, + would not handle the empty branch correctly, e.g. the pattern + "net.venge.monotone{,.*}" would not match the string + "net.venge.monotone". This has been fixed. + + - monotone now tries harder to find the cancel hint in a commit + message and only aborts if it can't find it anywhere + (fixes monotone bug #30215) + + - The import command no longer warns about not being able + to write out _MTN/options on --dry-run + (fixes monotone bug #30225) + + - 'automate remote' and 'automate remote_stdio' can now be used + without transport authentication (e.g. on file:// or ssh:// + transports) as well as anonymously over netsync + (fixes monotone bug #30237) + + - monotone does no longer warn about missing implicit includes + when dealing with restricted file sets + (fixes monotone bug #30291) + + - The 'passphrase' and 'dropkey' commands now handle private keys + in old-style key files (without the hash part in the file name) + properly. + monotone also makes it very sure now that the key file of a + private key which is about to be deleted really and only + contains the key which should be deleted and nothing else + (fixes monotone bug #30376) + + - monotone no longer throws an unrecoverable error if a public or + private key is addressed with some non-existing key id + (fixes monotone bug #30462) + + - A regression in 0.48 made a path-restricted 'mtn log' show + revisions, in which not the picked path(s), but one of its parents + were changed. This has been fixed. + + - 'mtn trusted' will no longer accept single bogus revision ids, + but instead validates if the given revision really exists in the + current database. + + - 'mtn read' (and also 'mtn automate read_packets') now tests public + and private key data more thoroughly and aborts if it encounters + invalid data. + + - 'mtn conflicts store' now gives a proper error message when + run outside a workspace (fixes monotone bug #30473) + + Other + +Sun Jun 13 22:13:53 UTC 2010 + + 0.48 release. + + Changes + + - Much more information is now passed to the editor when composing a + commit message for a new revision. The Author, Date, Branch and + Changelog values may now all be changed directly in the editor + allowing new branches to be created without using the --branch option. + Changes to other lines of this information must not be made or the + commit will abort. + + - The edit_comment lua hook now only takes one argument which is the + text to be passed to the editor to edit a commit. Existing hooks that + override the default hook will need to be changed to work properly. + + - The long date/time format used by 'status', 'commit' and 'log' must + be sufficient to preserve a date through a formatting and parsing + cycle. The 'status' command now checks for this and warns if the + format is unsuitable and 'commit' will refuse to operate with an + unsuitable format. + + - The output of the 'status' and 'log' commands has changed to align + with the new information displayed by 'commit' so that all three + commands display revisions similarly. + + - The 'setup' as well as the 'clone' command check if no managed default + database exists and if no database is given either as command line + or as workspace option and eventually create a new default database + outside of the bookkeeping directory of the new workspace (see below + for more information on the new management features). + + - The output of monotone diff has changed to use /dev/null as the source + for added files and as the target for deleted files. This is + compatible with patch(1) and will cause it to add and delete files + where appropriate. As part of this change diff will now include the + removed contents of deleted files which were omitted in earlier + versions of monotone. + + - Monotone will only warn about bad certs if there are not also matching + trusted certs. So if someone commits a bad branch cert, monotone will + only warn about that bad cert until someone else approves that + revision into the same branch (fixes monotone bug #8033). + + - 'db check' now checks for errors in the branch heads cache, + and 'db regenerate_caches' fixes them. + + - The output of the Lua functions print() and io.write() is now + redirected to the standard progress message stream of monotone. + See chapter 6.3 in the documentation for details. + + New features + + - Monotone has now database management capabilities: If you place your + databases in one or more specific locations (defaults to + %APPDIR%/monotone/databases on Windows and $HOME/.monotone/databases + on Linux, configurable by a hook), it is able to discover these + databases and access them only by giving the (base) name of their + filename, for example ":my-database.mtn". + + You can also directly create new databases in the first found default + location by issuing 'mtn db init -d ":my-database.mtn". + + Some commands, like 'setup' and 'clone' automatically fall back to + a default database (":default.mtn", also configurable by a hook) if + no database option is explicitely given. + + Additionally, monotone remembers checked out workspaces for every + managed database and displays these "known" registered paths together + with other information in the new 'list databases' command + (closes monotone bug #8916). + + - A set of accompanying management commands - 'register_workspace', + 'unregister_workspace' and 'cleanup_workspace_list' - to handle moved + or removed workspaces for managed databases have been added. + + - Many commands that change the heads of a branch (approve, disapprove, + pull, merge, etc) can now take an option "--update". If run from + a workspace which is based on a head of the branch and has no local + changes, this option makes these commands update that workspace to + the new head. If you always want this behavior, you can define the + get_default_command_options(cmd) + hook in your monotonerc (fixes monotone bug #17878). + + - New command 'undrop' which undoes a 'drop' done by mistake + (fixes monotone bug #13604). + + - New automation command 'update' which behaves identical to + the normal 'update' command. + + - 'ls tags' now outputs the branch name(s) a tagged revision is on. + The revision id is shortened to the first ten characters to get some + more space for this (fixes monotone bug #12773). + + - Default include and exclude patterns are now remembered per server. + This means that you can have for example one server that you sync + everything to, and one that you only sync some branches to, and you + don't have to worry about forgetting to give the include pattern and + accidentally trying to sync everything to the second server. + + - A new Lua extension function change_workspace(directory) has been + added. This should be most useful for custom commands which need + to work on multiple workspaces from the same monotone instance. + + - There is also the new server_set_listening(bool) Lua extention + function available since 0.47, which can be used to let a monotone + server exit gracefully instead of having to be killed. + + Bugs fixed + + - A regression in 0.47 prevent successful execution of push / pull / + sync over pipes (Debian bug 574512); this has been fixed. + + - A bug in 0.46 and 0.47 could lead to pulls or possibly commits taking + approximately forever, if any of the previous branch heads was not a + "close" relation of the new head. This has been fixed. + + - Several bugs related to restrictions not including the required parent + directories of included files have been fixed. It is now possible to + say 'mtn add a/b/c' followed by 'mtn commit a/b/c' and have the commit + succeed. See the restrictions section in the manual for more details + (fixes monotone bugs #15994, #17499, #20447 and #22044). + + - monotone no longer saves changed options from the command line back + to _MTN/options in case the command execution was unsuccessful + (fixes monotone bug #22928). + + - When monotone reads packets from files, like f.e. keys in a directory + given by the --keydir option, and these files are large and do + not contain packet data at all, monotone no longer uses an excessive + amount of time and memory to figure this out + (fixes monotone bug #28799). + + - The 'log' command no longer crashes if it is executed in a workspace + whose parent revision(s) do not exist in the specified database + (fixes monotone bug #29677). + + - The 'clone' command no longer removes an existing bookkeeping + directory if the target directory "." points to a workspace + (fixes monotone bug #29927). + + - The commands in monotone's help output are now sorted alphabetically. + + - monotone on Windows will now have a non-zero exit code when + interrupted (^C). This was broken in 0.47 when it was fixed to not + throw an exception on being interrupted. + + - In 0.46 and 0.47, monotone could sometimes get confused + about which revisions were the heads of a particular branch. + This would happen when a new branch cert was added to a + revision that was an ancestor of one or more of the current + heads of the branch, most commonly during netsync when + multiple people had performed identical merges. This is + fixed now. 'db check' will identify the problem; if your + database currently gives incorrect 'heads' results, or 'mtn + bug' on 'merge', you can fix it by running 'mtn db + regenerate_caches'. + + - In 0.46, spurious network disconnects could occur when transferring + sufficiently large items (files, diffs, revisions). This was fixed + in 0.47 but not noted in the release notes at that time + (fixes monotone bug #28991). + + - monotone on Windows will now have a non-zero exit code when + interrupted (^C). This was broken in 0.47 when it was fixed to not + throw an exception on being interrupted. + + - the 'mv' command now warns when a source is being renamed onto + itself (fixes monotone bug #29484). + + Other + + - Support for the diffuse merger (http://diffuse.sourceforge.net) + has been added. + +Sun Mar 14 21:15:06 UTC 2010 + + 0.47 release. + + Changes + + - The default '' author used by the git_export command has + changed to 'Unknown ' and must be changed in existing author + map files. The old '' author will be rejected by the new + validate_git_author lua hook. + + - The 'git_export' command now validates all git author and committer + values using a new 'validate_git_author' lua hook before they are + written to the output stream. The export will fail if any value is + rejected by this hook. + + - The 'git_export' command now calls a new 'unmapped_git_author' lua + hook for all git author values not found in the author map file. The + default implementation of this hook attempts to produce valid git + authors using several default pattern replacements. + + - The 'get_date_format_spec' lua hook now has an additional parameter + which hints at the wanted format (f.e. a short date or a long date + time). The default implementation now returns '%x' for short and + long dates, '%X' for short and long times (currently unused) and + '%x %X' for short and long date times. + + - The options '--date-format' and '--no-format-dates' are no longer + specific to the 'log' command, but can now be used globally. + + - monotone now prompts only three times for a key password. + + New features + + - Added portuguese translation (thanks to Américo Monteiro) + + Bugs fixed + + - 'passphrase' now allows an empty new password to be given + (fixes monotone bug #28809) + + - 'automate remote' and 'automate remote_stdio' no longer + require an existing database (fixes monotone bug #28885) + + - monotone no longer throws an exception on Windows if it is + interrupted (^C); a couple of other bug have been fixed for this + platform as well which generally improve the compatibility. + + - The annotation of 'annotate' is now localized. + + - The various occurrences where a revision is described by its + certs now come with proper localized date output. + + - Fix problems with newer Lua versions especially when + LUA_COMPAT_VARARG not set. + + Other + + - Roster handling has been sped up significantly, and roster cache + performance has been fixed for the case of overly large rosters. + This should be mostly noticable when digging through history + (especially initial pulls, since those send so many revisions), + and be more noticable for projects with larger trees. + + The most significant internal change from this is that rosters and + marking_maps are now copy-on-write. A longer overview of the internal + changes is at: + http://lists.gnu.org/archive/html/monotone-devel/2010-02/msg00043.html + + - Improve the compatibility with newer Botan versions. + +Sun Jan 17 21:40:35 UTC 2010 + + 0.46 release. + + Changes + + - "automate stdio" (and "automate remote_stdio", see below) + use separate streams to encode out-of-band information like + informational messages, warnings or tickers. A special + "header" section has been added to the standard output to + identify future stdio version changes. The error codes used + in the output of both stdio and remote_stdio, have also + slightly changed: errors which are the result of a wrong + call (unknown command, invalid options, parsing errors, ...) + are returned with code 1, while errors which happened while + the actual command executed are returned with code 2. Error + codes are no longer echoed with every packet, but only as + the payload of the final 'l' ("last") packet. + + Please consult the manual section "mtn automate stdio" for a + detailed description of the new format. + + - The 'heads' command should be significantly faster now (not + that it was particularly slow before). This probably isn't + terribly noticable unless you're in the habit of using "h:*" + (heads of all branches) as a selector, it's primarily meant + to enable future changes that will depend on fast 'heads'. + + The database schema has been changed, so you will need to + run 'mtn db migrate' (preferably after making a backup copy + of your db). + + - the 'status' command now includes the current (to be committed) + revision number and will indicate when the branch option in + _MTN/options has been changed and does not match one of the + revision's parent branches. + + - Cert labels in the output of the 'log' command are now + localized. + + New features + + - There's a new command "automate remote_stdio" that makes it + possible to execute automate commands on a remote server + (for example, to permit a single database to be used both + for serving netsync connections and for running a viewmtn + instance). This requires that the server be running monotone + 0.46 or later. Access control on the server uses a new lua + hook "get_remote_automate_permitted(identity, command_line, + options)". + + - There's also a new command "automate remote" that's very much + the same, but executes only a single command and does not + stdio-encode the output. + + - A new 'bisect' command has been added to allow searching for a + specific revision within a range of revisions. This can be useful for + locating the exact revision that broke something or removed a + particular feature. + + - Three new commands - 'push', 'pull' and 'sync' - have been added + to the automation interface. They work just as their non-automate + counterparts. + + - The global option '--timestamps' has been added which prefixes + the current local timestamp before diagnostic messages such as + warnings, progress messages, errors and tickers. For example, + this option can be used to log the date and time when clients + connect to a monotone server. + + Bugs fixed + + - A regression from 0.45's key migration prevented the proper + output of the `committer` field in 'git_export'. + + - 'db info --full' no longer crashes when executed on a database + with only one revision. + + - The mtn_automate Lua function which can be used for custom + commands now properly handles binary data. + + - `db info` now returns a correct byte count for certs again. + + - If a public key was read in via the `read` or + `automate read_packets`, an invariant was triggered if the + key was already existing in the database. This has been fixed. + + - `annotate` no longer crashes if the annotated file is empty. + + Other + + - Added the script of the Lua-based contributed Monotone + extension command "mtn remote_export" to contrib/command/ + with which a remote revision can be exported locally without + having to fetch all of the history before. + + +Fri Sep 11 20:50:00 UTC 2009 + + 0.45 release. + + Changes + + - Certs now link to the key that signed them by the key's + hash, instead of its name. This should provide some + security and usability improvements. + + The database schema has been changed, so you will need to + run 'mtn db migrate' (preferably after making a backup copy + of your db). + + The netsync protocol version has also changed. However, we + found space to implement full protocol version negotiation, + so no flag day is needed. If your particular project has a + situation where there are multiple keys with the same name, + you will receive errors when trying to sync certs signed by + those keys to older netsync peers. + + A number of commands have slightly different output now, + particularly 'ls certs', 'ls tags', 'automate keys', + 'automate tags' and 'automate certs'. There is a new Lua + hook associated with these changes, + 'get_local_key_name(identity)', and all Lua hooks that used + to take a key name as an argument now instead take a table + with several fields. + + Commands which previously accepted a key name now also + accept the key's hash or local name, which is a local alias + for equally named keys. 'read-permissions' and + 'write-permissions' accept either the key name or the hash. + + There is also a new 'db fix_certs' command which fixes wrong + key assignments in migrated databases if you have the correct + key available. + + - The 'resolved_user' conflict resolution is no longer + reported by 'automate show_conflicts' for file content + conflicts; 'resolved_user_left' is used instead. + + - 'format_version' was removed from 'automate tags' and + 'automate get_attributes' which both do not need this + additional versioning information. + + New features + + - The 'log' command now, by default, converts all dates it + prints to your timezone instead of leaving them in UTC, and + uses a somewhat more friendly format for the dates. + + You can customize the date format with the new + "get_date_format_spec" Lua hook, which returns a strftime(3) + format string. You can also override the format for one + command with the new --date-format option, disable date + conversion for one command with --no-format-dates, or + disable it by default by having the above Lua hook return an + empty string. + + - The 'diff' and 'automate content_diff' commands take a + '--reverse' option when one revision is specified, to + control the order of the diff with the workspace. + + - The 'update', 'checkout', 'pluck', and 'pivot_root' commands + take an option '--move-conflicting-paths', to handle + unversioned files that are blocking the action. The + unversioned files are moved to + _MTN/resolutions/, so the action can + succeed, and the user can recover the files if necessary. + + - Resolution of orphaned file conflicts is now supported by + 'merge --resolve-conflicts' and the 'conflicts' commands. + + - Duplicate name conflicts now support the 'keep' resolution. + + - Monotone now accepts ':memory:' as argument to the --db option + and sets up a memory-only SQLite database. + + - 'clone' allows cloning into the current directory when + '.' is given as argument. + + Bugs fixed + + - Monotone now sanely skips paths with invalid characters + it encounters during 'add' or 'automate inventory'. + + - Key names, cert names, and var domains with non-ASCII + characters should work properly now. Previously, they would + be (usually) converted to punycode on input, and not decoded + on output. They will now not be converted to punycode at + all. + + - The 'conflict' commands can now handle duplicate name + conflicts for directories. + + - 'cvs_import' now properly parses CVS timestamps (again). + + - Windows' cmd.exe is recognized as smart terminal and thus + monotone should create more readable output in + netsync operations. + + +Tue May 12 20:44:00 UTC 2009 + + 0.44 release. + + Changes + + - Private keys no longer have a separate hash from the associated + public key. This changes the hashes output by 'ls keys', and also + changes the format of 'automate keys' and 'automate genkey'. + + New features + + - New 'w:' selector type for selecting the revision the workspace + is based on. + + Bugs fixed + + - C++ exceptions in Lua extension functions are now converted into + Lua errors catchable with pcall, instead of causing a crash. + + - In 0.43 revert became excessively noisy and would report changes to + all attributes on included files and directories regardless of whether + the attributes had been changed or not. This has been silenced. + Monotone will now specifically report changes to execute permissions + only when they occur. + + - In 0.43 monotone would lose execute permissions on all files modified + during an update operation. Execute permissions are now reset on + updated files that have the mtn:execute attribute set to true. + + - Invalid revision selectors now cause an immediate error instead of + being dropped from the selection. The old behavior could produce + undesired effects from typoed commands, such as spewing a list of + all revisions in the database. + + - If "automate stdio" is in use, invalid selectors are reported via + the automate protocol rather than on stderr. + + - "Best-effort" character set conversions now work again; 'mtn log' + will not crash just because there is a change log entry with a + character not representable in your locale. However, if your system + iconv(3) implementation does not support the //TRANSLIT extension, + you may see garbage characters in the above scenario. + + Internal + + - Various small code changes to make monotone compile under (Open) + Solaris using Sun Studio, and under Windows with Visual C++. + + - monotone.spec has been removed from the distribution. + + +Sun Mar 22 22:26:00 UTC 2009 + + 0.43 release. + + Changes + + - The Monotone source distribution no longer includes copies of + several third-party libraries. This means they must be downloaded + and built separately, before building monotone. See INSTALL for a + complete list of necessary libraries. + + This allows monotone's developers to concentrate on monotone + itself, rather than tracking external library updates, which in + practice did not happen. By way of illustration, we were still + shipping sqlite 3.4.1, which is years out of date. This has also + been a long-standing request of various redistributors of binary + packages, who prefer the use of globally shared libraries. + + - There is a new db var "database delta-direction", which can have + values "reverse" (default), "forward", and "both". This controls + what kind of deltas are stored for new file versions. Forward + deltas are very fast for netsync, but slow for most other uses. + Set this to "both" (or perhaps "forward" if you're very short on + disk space) on an empty db and pull everything into it, to get a + database which will be much faster for server usage (especially + initial pulls). + + - 'mtn help ' or 'mtn --help' no + longer print global options, thus making the output of specific help + requests more compact. You still see all available global options + by executing 'mtn help' without any arguments. + + - 'mtn automate get_current_revision' now returns an empty changeset + instead of an error if a workspace contains no changes. + + New features + + - A monotone database may be exported in the git fast-import format + using the git_export command. The output from this command may be + piped into git fast-import or other tools supporting this format. + + - Additional 'u:' and 'm:' selector types for selecting the revision the + workspace was last updated from and revisions matching specified + message globs in changelog and comment certs. + + - Additional '--revision' option for 'mtn log' allows logging of + selected sets of revisions. + + - Additional '--full' option for 'mtn db info' to display some + statistic analysis of the date certs in the database. + + - Command line options in the EDITOR and/or VISUAL environment + variables are honored; for instance, EDITOR="emacs -nw" + works now. (Debian bug #320565.) + + - The `mtn_automate' lua function now correctly parses and sets + options for executed automate commands. + + - The 'commit' command accepts a non-empty _MTN/log as the log + message when '--message-file=_MTN/log' is given. + + Bugs fixed + + - Performance of the log command has been improved significantly. + Previous versions of monotone loaded individual certs by name for each + printed revision and this caused sqlite to not use the correct + index. Now, all certs are loaded for each printed revision once and + individual certs are selected from the full list which allows sqlite + to use the preferred index. + + - In 0.42, a netsync writer would attempt to queue up all outgoing + data as soon as it knew what data to send, in a single operation, + without servicing the event loop. If there was a large amount of + data to send, this would cause very long pauses and sometimes + timeouts and dropped connections (for pauses over 10 minutes). + The bug that caused this is fixed, and that operation now has a + safety timer that should prevent it from coming back. + + - When the netsync server receives garbage over the network, it + should be much better about only terminating the offending connection + instead of the entire server. + + - The log command was missing '--depth' and '--exclude' options used to + restrict revisions printed to those touching specific paths. Log now + allows these options and uses them properly. + + - The update command previously did not clear execute permissions from + files that had their associated 'mtn:execute' attribute cleared. + + - Several minor problems with workspace attributes have been fixed. + Earlier versions of monotone would reset attributes such as + mtn:execute on all files when any workspace modifying command was + executed. Applying attribute changes to workspace files is now done + much more selectively in the same manner that content and name changes + are applied. + + - In certain cases, especially also on FreeBSD and Mac OS X, netsync + called select() even after read() returned 0 bytes to indicate the + end of the file, resulting in a confusing error message. This + is fixed by treating EOF specially and prevent further calls + to select() on the file handle, as recommended by the + select_tut man page. + + - If given a filename, `mtn ssh_agent_export' now creates that + file with the correct permissions (i.e. mode 600), creates + directories as necessary, and does not throw an internal + error if creation or writing fails. (You're still on your + own for directory creation and permissions if you take the + key on standard output and redirect it to a file.) + + - The `p:' selector now accepts single character revision ids. + + - `mtn merge_into_workspace' no longer crashes if one tries to merge + in an ancestor or descendant of a workspace, but gives a helpful + error message. + + - Several bugfixes to `mtn automate stdio': + + * It now correctly distinguishs between syntax and command errors by + returning error code 1 for the former and error code 2 for the + latter - just as advertised in the documentation. + + * The stdio event loop no longer quits if a syntax error occurs, but + rather discards the wrong state and accepts new (valid) commands. + + * Option errors haven't been catched properly and thus weren't encoded + in stdio either; this has been fixed as well. + + * Global options, which were set or changed by a previously executed + command, weren't properly reset before the next command was issued. + It was f.e. not possible to "unignore" suspended branches for + the `branches' command when `--ignore-suspend-certs' was given in + a previous run. Now only those global options persist between + executed commands which were given to stdio directly. + + Internal + + - Using 64 bit integer values to represent dates internally. This + has no user visible effect. + + - The unit test code has been separated from the main source, thus + building the tests no longer requires a full recompilation. Also, + the number of modules which are linked into unit tester has + decreased tremendously. + + - A couple of debug commands have been added to the `database' + command group to aid performance timing. See `mtn help --hidden db' + for a list of available commands. + + - Our internal error handling has been overhauled. N() is gone, and E() + takes three arguments instead of 2: E(bool, origin::type, i18n_format). + origin::type is an enum describing the source of the error, eg network, + user, internal. Data types can publically inherit origin_aware (as the + vocab types do) to obtain a public origin::type member named + 'made_from'; this can then be supplied to E() when sanity-checking + that data. origin_aware and origin::type are in origin_type.hh. + I() will throw a unrecoverable_failure, and E() will throw either a + unrecoverable_failure or a recoverable_failure depending on the + origin::type provided. informative_failure is gone. + + +Fri Dec 26 22:08:00 UTC 2008 + + 0.42 release. + + Changes + + - The output of 'automate show_conflicts' has been changed; a + default resolution for file content conflicts and user resolutions + for other conflict types has been added. 'directory_loop_created' + changed to 'directory_loop'. + + - The French, Brazilian-Portuguese and Japanese translations were + outdated and thus have been removed from the distribution. In case + you care about them and want them back, drop us a note at + address@hidden + + Bugs fixed + + - 'mtn db kill_rev_locally' did not update the inodeprint + cache when executed from a workspace on which the + revision's changes where applied. + + - Some recent performance issues have been corrected: + * since 0.40, there is much more use of hex encoding/decoding. + These functions have been sped up considerably. + * since 0.40, every command in an 'automate stdio' session + would reinitialize the database. This was rather slow, so + monotone will now keep the database open between commands. + + - The Lua-based contributed Monotone extension introduced in + 0.38 haven't been added to the tarball; this has been fixed. + + - Monotone died if _MTN/options contained an empty / not-existing + 'keydir' entry. This has been fixed. Also, invalid options are now + better detected and give a more useful error message. + + - Monotone crashed if it was called with more than 2048 command + line arguments. This has been fixed. + + - If vim is used as merger, it no longer prompts the user for an + enter key press. + + - Decoding errors f.e. through to garbage from the network no longer + results in informative failures, but in warning. This was made + possible by introducing the concept of origin-aware sanity checks. + + - Monotone crashed if it was called with nested wildcards such as + 'a.{i.{x,y},j}'. This has been fixed. + + - The standard implementation of the 'ignore_file' hook now accepts + windows and unix line endings in .mtn-ignore files. + + New features + + - New 'mtn ls duplicates' command which lets you list + duplicated files in a given revision or the workspace. + + - New option --no-workspace, to make monotone ignore any + workspace it might have been run in. + + - New command group 'mtn conflicts *'; provides asynchronous + conflict resolutions for merge and propagate. + + - New 'automate file_merge' command which runs the internal line + merger on two files from two revisions and outputs the result. + + - New 'automate lua' command with which lua functions, like + monotone hooks, can be called over automate. This is particularily + useful to get user defaults, like ignorable files, branch keys and + passwords, which are managed through one or more monotonerc files. + + - New 'automate read_packets' command which reads data packets like + public keys similar to 'mtn read'. + + - 'merge' and 'propagate' accept user commit messages; the + 'merge rev rev' or 'propagate branch branch' message will be + prefixed to the user message. --no-prefix removes the prefix. + + Internal + + - Update Botan to 1.7.12. + + +Wed Sep 3 21:13:18 UTC 2008 + + 0.41 release. + + Changes + + - 'mtn clone' now takes a branch argument rather than a branch + option which is more what people expect given the fact that + mtn push/pull/sync do not use a branch option either. + + - 'mtn automate inventory' will show the birth revision for + any file that has been committed. + + Bugs fixed + + - If the options '--db' or '--keydir' were previously + specified for a command which was executed inside a + workspace and one or both option arguments were invalid + (f.e. invalid paths), they were still written to + _MTN/options of the particular workspace. This lead to + errors on any subsequent command which used these + options. This bug is fixed in so far that basic file type + checks are applied on both options, so its no longer + possible to set non-existing paths accidentally or use a + path to a directory as option argument for '--db'. + + - If a key clash occurs on a netsync operation, i.e. two + different keys with the same key id are encountered, mtn now + fails cleanly and provides further guidance how to proceed. + + - It was previously not possible to clone a branch / database + anonymously; this has been fixed. + + - If the client tries to use an unknown key, try to fall back + to anonymous pull instead of failing immediately. + + - 'mtn automate identify' was broken in 0.40 when used over + stdio, i.e. the output of the command did not get into the + right output channel; this has been fixed. + + - Monotone would produce a warning if executed from the root + directory of a Windows drive; this has been fixed. + + - The 'note_commit' hook now returns the new revision id + hex-encoded again - the bug was introduced in 0.40. + + New features + + - New 'mtn suspend' command which lets you mark certain + revisions and thus whole branches as discontinued + ("suspended") by attaching a special suspend cert to the + revision. All relevant mtn commands (f.e. mtn heads, + mtn ls branches) honor this cert by default. To ignore it, + simply add '--ignore-suspend-certs' to your command line. + Suspended revisions can have children, which are in no + way affected by the cert of their parent, i.e. suspended + development lines or branches can simply be "unsuspended" + by committing to them. + This feature was already added in monotone 0.37, but was + forgotten to be mentioned in NEWS back then. + + - New 'get_default_command_options' lua hook which lets you + specify default options for a given, triggered command. + Useful f.e. if you always want to have your 'mtn add' + command executed with '-R' / '--recursive'. + + - Add 'automate show_conflicts' command. + + - Add 'automate get_workspace_root' command. + + - Add Lua hooks 'note_netsync_revision_sent', + 'note_netsync_cert_sent' and 'note_netsync_pubkey_sent'. + + +Fri Apr 11 22:50:44 UTC 2008 + + 0.40 release. + + Changes + + - The vim merger has been improved and now uses diff3 to merge + non-conflict changes automatically before executing vimdiff. + + - Values used with the --depth option used to control recursion with + node and path restrictions have changed. Using --depth=0 now means + exactly the specified directories and *not* their children. Using + --depth=1 now means the specified directories and their immediate + children. Previously --depth=0 included children and --depth=1 + included grandchildren and it was not possible to exclude children + using --depth. The simple fix for anyone using --depth is to add 1 to + the values they are using. + + - Document that ssh: and file: sync transports are not supported on + native Win32. + + Bugs fixed + + - `commit' now uses keydir specified in _MTN/options + + - duplicate name conflicts now show a proper error message, even if + a parent directory got renamed as well. In that case, the error + message now shows both names for the directory and the offending + file name. + + New features + + - The bare parent selector 'p:' can now be used in a workspace to + query the parent(s) of the workspace' base revision. This is + equivalent to "mtn au select p:`mtn au get_base_workspace_revision`". + + - push, pull, and sync can be run with a single argument, which looks + like + mtn://hostname?include_pattern/-exclude_pattern + or + mtn://hostname?include=include_pattern/exclude=exclude_pattern + + Internal + + - Update Botan to 1.7.4. + + - Usage of the internal app_state object has been reduced, objects + are better encapsulated now. The database interface has been + enhanced to ease reduction of locking contention in the future. + + - Merged the two indexes on revision_certs into a single one. + + - The database schema has been changed so that it now stores + binary SHA1 hashes rather than their hexadecimal encoding, + in most places where these are used. This reduces the + database size and speeds up operations a little. + + Users who like to fiddle with the database directly are + advised to use the sqlite functions hex() and quote() to + print columns that store hashes (including IDs), and the + hexadecimal literal notation x'DEADBEEF' to input them. + + - Binary SHA1 hashes are also used for most in-memory + processing, avoiding conversions and saving memory. + +Mon Feb 25 15:55:36 UTC 2008 + + 0.39 release. + + Changes + + - 'mtn di' is now an alias for 'mtn diff'. + + - 'automate db_set' has been renamed to 'automate set_db_variable'. + + - 'automate db_get' has been replaced by 'automate get_db_variables' + which returns all database variables similar to 'list vars' in + basic_io format, optionally restricted by domain. + + - The REVID argument of 'automate get_revision' is now mandatory; + to retrieve the current workspace revision, use the new command + 'automate get_current_revision' + + - messages describing conflicts from all of the various merge commands + have been reworked and should be much more informative. + + - mtn show_conflicts now outputs much more detailed and descriptive + messages, however it may report content conflicts that will be + resolved automatically by the line merger. + + - The internal copy of PCRE has been updated to version 7.6. + If you use the '--with-system-pcre' configure switch, it + will insist on at least this version. + + - "emacs" has been removed from the list of dumb terminal types; + tickers should now default to --ticker=count with emacs terminals + + - extensive section on merge conflicts and ways to resolve them + added to the manual. + + Bugs fixed + + - for changes near the beginning of a file, mtn's unified diff + output sometimes contained too many leading context lines. + + - the path handling of 'mtn revert' was improved and fixed two bugs: + now a restricted revert on a node "dir1/file1" reverts only the + content changes in "file1", but leaves renames of any of its + ancestor nodes untouched; furthermore, if "dir0/" was renamed to + "dir1" and "dir1/file1" was dropped, mtn now re-creates file1 at the + proper place ("dir1/") and leaves no missing files around because + of the non-existing "dir0/". + + - a few changes needed to build with gcc 4.3. + + New features + + - 'automate drop_db_variables' which drops one database variable + (like the 'unset' command) or all variables within a given domain. + + - 'automate inventory' now accepts the options '--no-ignored', + '--no-unknown', '--no-unchanged' and '--no-corresponding-renames'. + Please consult the monotone documentation for more information about + these new options. + In addition, 'automate inventory' no longer recurses into ignored + directories. The typical case of listing files that need attention + now runs at least four times faster. + + - 'automate get_current_revision' which outputs the revision text of + changes in the current workspace + +Wed Dec 12 21:21:15 UTC 2007 + + 0.38 release. + + Changes + + - mtn log now prints a single dot for a project's root + directory instead of an empty string. + + - mtn now warns if changes to a file will be ignored because + the file has been deleted on one side of a merge. + + - mtn now errors if your chosen private key doesn't match the public + key of the same name in your database. + + - mtn now checks for your key before a merge action takes place to + ensure that any manually merged file isn't lost in an error case + + Bugs fixed + + - a bug introduced in 0.37 prevented an external merger from being + executed unless the MTN_MERGE environment variable was set + + - mtn read successfully reads revision data, and cert packets again + + - mtn consistently supports certs with empty values + (fixed 'ls certs' and 'read') + + Internal + + - Update Botan to 1.7.2. + + - Moved the gzip implementation out of the Botan directory. + + Other + + - Added the scripts of the following Lua-based contributed + Monotone extension commands to contrib/command/: + "mtn base", "mtn fuse", "mtn revision", "mtn conflicts". + + - Added a hooks version of the contributed ciabot script, + contrib/ciabot_monotone_hookversion.lua + + - The monotone manual is now licensed under the GPL rather than + the GFDL. + +Fri Oct 25 22:35:33 UTC 2007 + + 0.37 release. + + Changes + + - mtn db kill_rev_locally now checks for an existing workspace + before the revision is killed and tries to apply the changes + of this particular revision back to the workspace to allow + easy re-committing afterwards + + - the "--brief" switch for mtn annotate has been renamed to + "--revs-only" for clarity + + - mtn help now lists the commands (and their aliases) available + within a group, so its easier to get an overview which commands + are available at all + + - the "MTN_MERGE=diffutils" merger (provided by std_hooks.lua) + was improved. It now accepts a MTN_MERGE_DIFFUTILS environment + variable which can be used to control its behaviour + through comma-separated "key[=value]" entries. Currently + supported entries are "partial" for doing a partial + batch/non-modal 3-way merge conflict "resolution" which uses + embedded content conflict markers and "diff3opts=[...]" and + "sdiffopts=[...]" for passing arbitrary options to the used + "diff3" and "sdiff" tools. When used in combination with "mtn + merge_into_workspace" this way one especially can achieve a + CVS/SVN style non-modal workspace-based merging. + + - There is a new revision selector: "p:REV" selects the + parent(s) of revision REV. For example, if a revision has + one parent, + + mtn diff -r p:REV -r REV + + will show the changes made in that revision. + + - Monotone now uses the Perl-Compatible Regular Expression + (PCRE) library for all regular expressions, instead of the + boost::regex library. This means that external Boost + libraries are no longer required to build or use Monotone. + If building from source, you will still need the Boost headers + available somewhere. See INSTALL for details. + + PCRE's syntax for regular expressions is a superset of + boost::regex's syntax; it is unlikely that any existing + .mtn-ignore files or other user uses of regexps will break. + The manual now contains detailed documentation of the regexp + syntax, borrowed from PCRE itself. + + - the format of "mtn automate inventory" has changed to basic_io. + This fixes a couple of corner cases where the old format + returned wrong information and introduces new capabilities like + restricted output, recognized attribute changes, and more. + For a complete overview on the new format, please take a look + in the appropriate manual section. + + Bugs fixed + + - mtn automate heads called without a branch argument now properly + returns the head revisions of the workspace's branch if called + over mtn automate stdio + + - mtn commit no longer crashes if it creates a revision whose + roster already exists, i.e. was left behind by the command + `mtn db kill_rev_locally REV` (savannah #18990) + + Documentation changes + + - the documentation of the "--revs-only" (formerly "--brief") + switch for the annotate command didn't match its actual + behavior, this has been fixed + + - documentation for the "ssh_agent_add" command was missing + and has been added + + Other + + - contrib/usher.cc has been removed. Please use the + net.venge.monotone.contrib.usher branch instead. + + Internal + + - Update SQLite to 3.4.1. + + - Update Lua to 5.1.2 plus latest bug fixes. + + - Update Botan to 1.5.10. + + - Internal use of regular expressions has been almost eliminated. + (Regular expressions are still used for .mtn-ignore and the + --show-encloser feature of mtn diff, and are still available to + Lua hooks.) + + + +Fri Aug 3 06:08:36 UTC 2007 + + 0.36 release. + + Changes + + - The help command is now able to show documentation on subcommands + (such as 'attr set'). + + - The help command now shows a brief abstract of each command, + instead of only listing their names. + + - The command `list changed` now outputs the new path of any + renamed item making it easier to copy and paste these paths + for external program usage. + + - `automate attributes` has been renamed to `automate get_attributes`, + also a bug has been fixed there so resurrected attributes are now + properly outputted as "new" and not "changed". + + New features + + - Two new commands to set and drop attributes over automate: + `automate set_attribute` and `automate drop_attribute` + + - There is a new function available to the lua hooks, + 'server_request_sync(what, address, include, exclude)', which will + initate a netsync connection to the server at "address", with the + given include and exclude patterns, and will sync, push, or pull, + as given in the "what" argument. If called from a monotone instance + which is not acting as a server, this function will do nothing. + + - There is a new hook available, + 'get_netsync_key(server, include, exclude)', which is called to + determine which key to use for netsync operations. Note that the + server calls this once at startup with the address it is listening + on, "*", and "" as arguments, rather than for each connection. + + Other + + - Giving the --confdir argument will automatically set the key store + directory to keys/ under that directory, unless --keydir is also + given. This is a bugfix. + + - Fixed a regression in 0.35 that resulted in some databases + becoming significantly larger when storing new revisions. Existing + databases with this problem can be fixed by pulling into a fresh + database using 0.36. + + - contrib/lua-mode.el, a Lua mode for GNU emacs. + + - contrib/monotone-buildbot-notification.lua, a netsync hook to have a + server notify a buildbot when new changes have arrived. Useful for + anyone who uses a buildbot with monotone as source. + + - contrib/monotone-cluster-push.lua, a netsync hook script to have + arriving changes be forwarded to other servers automatically. It + uses the new internal lua function 'server_request_sync'. + + - contrib/mtn_makepermissions, a simple script to create + read-permissions and write-permissions from files in the directories + read-permissions.d and write-permissions.d, Debian style. + + - contrib/Monotone.pm, a first attempt to write a Perl module to + interface with 'monotone automate stdio'. + + - contrib/monotone-import.pl has been removed since monotone now has + an internal import command. + + Internal + + - Commands are now defined as a tree of commands instead of a + plain list, which allows the help system to look up information + of a command at an level in the tree. + + - The command class, the automate class and all the associated + macros have been cleaned up. + + - All C++ files now depend on base.hh, which includes the few things + that are used virtually everywhere. 'make distcheck' will check for + the presence of base.hh in all source files and will protest if + it's not there. This is explained further in HACKING. + + - Update the internal SQLite to version 3.4.0. + + - Updated Visual C building system, which now also builds the test + programs. The script visualc/runtests.bat can be used to run the + tests. + + - Monotone can now be built successfully with Boost 1.34. Older + versions of monotone would sometimes seem to work depending on + the compiler used, but would have bugs in path normalization. + + - Monotone now requires Boost 1.33 or later. + + - The Boost filesystem library is no longer required. + + - The Boost unit test system is no longer required. + + + +Mon May 7 14:08:44 UTC 2007 + + 0.35 release. + + Changes + + - 'mkdir --no-respect-ignore PATH' now really skips any + ignore directives from .mtn-ignore or Lua hooks + + - Private keys are now stored more safely, using file + permissions. + + - The editable log summary (what you get in an editor when + committing without -m) now includes information about which + branch the commit applies to. + + - The status command and the editable log summary now show + the same details about the change. + + New features + + - 'automate identify', an automate version of 'mtn identify'. + + - 'automate roots', prints the roots of the revision graph, + i.e. all revisions that have no parents. + + Other + + - You can't drop the workspace root any more. + + Internal + + - Update the internal Lua to version 5.1.2. + + - Added build files for Mac OS X. + + - Update the internal SQLite to version 3.3.17. + + - Code cleanup of app_state. + + + +Sun Apr 1 08:23:34 UTC 2007 + + 0.34 release. + + The internal data format has changed with this release; + migration is straight-forward. To upgrade your databases, + you must run: + $ mtn -d mydb.mtn db migrate + All of these operations are completely lossless, and 0.34 + remains compatible with earlier versions all the way back + to 0.26 with regards to netsync. + + Changes + + - Text is now output at best of the environment's possibilities, + transliterating them or substituting '?' as needed. + + - The lua hook get_author() now takes a second argument, a + key identity, in case someone wants to create an author based + on that and not only the branch name. + + - The command 'chkeypass' became 'passphrase'. + + - The commands 'drop', 'rename' and 'pivot_root' default to + always perform the operation in the file system as well. + They do not accept '--execute' any more, but will instead + take '--bookkeep-only' in case the user only wants to affect + bookkeeping files. + + New features + + - New hook note_mtn_startup(), which is called when monotone is + started. + + - New Lua support function spawn_pipe(), which is used to run + a command and get back its standard input and standard output + file handles as well as the pid. + + - Monotone will automatically add a monotone key in a resident + ssh-agent when it's first used, and will then use ssh-agent + for all subsequent signing. Thus, you will only need to give + the password once in one session. + - New command 'ssh_agent_export' to export a monotone key into + an SSH key. + - New command 'ssh_agent_add' to add a monotone key explicitly + to a resident ssh-agent. + + - New command 'clone' that combines 'pull' and 'checkout'. + + - 'automate put_file' and 'automate put_revision' stores a file + and a revision in the database. + + - 'automate cert', an automate version of 'mtn cert'. + - 'automate db_set', an automate version of 'mtn set'. + - 'automate db_get', an automate version of 'mtn ls vars' with + a twist. + + Other + + - contrib/ciabot_monotone_hookversion.py now uses a real + basic_io parser and thus should send more precise + information to the cia server. Furthermore, it has become + more careful with creating zombies. + + - contrib/monotone-log-of-pulled-revs-hook.lua, a lua hook + to display information about incoming revisions. + + - contrib/monotone-mirror-postaction-push.sh, a post action + script that should be executed by contrib/monotone-mirror.sh + to automatically push data on to other servers. + + - contrib/monotone-mirror.lua, a lua hook that executes + contrib/monotone-mirror.sh after any netsync session is done. + + - contrib/monotone-mirror.sh now takes keydir and keyid + configuration and has better protection against overlapping + duplicate runs. + + - contrib/monotone.bash_completion now handles signals. + + - contrib/monotone.el now includes a commit button. + + Internal + + - Date and time display has now been reimplemented internally + to avoid Boost more. This means that we have lowered our + dependency from Boost 1.33.0 to 1.32.0. + + - Lots of code cleanup. + + - The heights cache got an index, making the processing faster. + + - Update the internal SQLite to version 3.3.13. + + - Algorithm to find uncommon ancestors has been rewritten, so + 'pull' and 'regenerate_caches' should be faster. + + +Wed Feb 28 22:02:43 UTC 2007 + + 0.33 release. + + The internal data format has changed with this release; + migration is straight-forward. To upgrade your databases, + you must run: + $ mtn -d mydb.mtn db migrate + All of these operations are completely lossless, and 0.33 + remains compatible with earlier versions with regards to + netsync. + + Changes + + - "mtn ls unknown" no longer recurses into unknown directories. + + - update will fail rather than clobbering unversioned files + that exist in the workspace. + + - update will detect directories with unversioned files before + attempting to drop them and will refuse to run rather than + corrupting the workspace. such unversioned files must be + removed manually. + + - the character set and line separator conversion hooks + (get_system_linesep, get_charset_conv and get_linesep_conv) + have been removed. Similar functionality (probably based on + file type attributes) is planned and will be added in a future + release. + + - update will switch to the branch of a given revision if it + differs from the current workspace branch. + + - add will now accept combinations of --unknown, --recursive and + --no-respect-ignore. + + - import now imports unknown directory trees properly. + + - use SQLite 3.3.12. + + - schema migrator rebuilt and will now properly detect and report + if the database used is created by a newer monotone than the one + currently used. + + - removed the man page mtn.1, as it hadn't been updated for a long + time. + + New features + + - "mtn merge_into_workspace" (still to be documented). This command + will allow you to review and fix up a merge in your workspace + before committing it to the repository. However, the conflict + resolution interface remains the same as that of the 'merge' + command for now (i.e. monotone will invoke your specified merge + tool on all files with conflicts and you must resolve them as they + are presented). Work on in-workspace conflict presentation and + resolution is planned for the future. + + - "mtn log" will now print an ASCII revision graph alongside the + usual log text. + + Speed improvements + + - "mtn annotate file" should run even faster now. it exploits + the fact that we store deltas of rosters. by peeking at + these deltas, it can avoid reconstruction of whole rosters + in many cases. + + Other + + - contrib/monotone-mirror.sh and + contrib/monotone-mirror-postaction-update.sh, two scripts + to mirror and update directories automatically. + + - contrib/monotone-run-script-post-netsync.lua, to automatically + update a directory as soon as new revisions or certs arrive for + a given branch. + + - contrib/monotone.bash_completion had some improvemens. + + - contrib/monotone.el had some improvements. + + Internal + + - Internally, the concept of "projects" has been introduced. It + currently doesn't mean anything, but will be used later, with + policy branches and similar. + + + +Wed Dec 27 09:57:48 UTC 2006 + + 0.32 release. + + Changes + + - "mtn serve" no longer takes patterns on the command line. + Use the permissions hooks instead. + + - the name of the option that denoted the revision from which + "mtn log" should start logging was renamed from "--revision" + to "--from" + + - author selectors no longer have implicit wildcarding + + - if you manually add entries to MTN/log while you are + working, in preparation for an eventual commit, you will now + be required to remove a "magic" template line from the file + before the commit will succeed. This, like the test for an + empty log file, helps to prevent accidents. + + - the "db regenerate_caches" migration command replaces the + previous "db regenerate_rosters", generalising the task of + rebuilding or generating cached data that may be added + across an upgrade. Like "db migrate", which upgrades the + database schema, this command fills in the data for new + features. In this release, as well as rosters, it also adds + "heights" information used to speed up topology operations. + + Speed improvements + + - "mtn annotate file" and "mtn log file" are generally much + faster now, dependant on the number of revisions that + changed the file. Both commands as well as "mtn automate + toposort" make use of data called "heights" caching the + topological order of all revisions. In order to create and + use this data, the following must be run once for each db + after upgrading: + + $ mtn -d mydb.mtn db regenerate_caches + + New features + + - "mtn automate content_diff" + + - "mtn automate get_file_of" (same as get_file, but expects + a file path and optionally a revision) + + - "mtn import" command + + - "mtn log --to" + + - netsync_note_* hooks are given much more information, + inlcuding a http/smtp/etc style status code + + - includedirpattern(dir, fileglob) function for hooks + + + Bugs fixed + + - bug in "automate stdio" that would result in monotone + garbling its input in some circumstances fixed + + - "mtn annotate file" and "mtn log file" are generally much + faster now, dependant on the number of revisions that + changed the file. Both commands as well as "mtn automate + toposort" make use of data called "heights" caching the + topological order of all revisions. + + - spawn_redirected hook function now understands a blank + filename to mean not to redirect that stream + + - "mtn log" is now in proper topological order, also due to + the use of cached "heights" data + + - reset options between "automate stdio" commands + + - another compile fix for gcc3 + + - bug in localization code where option strings where not + always properly translated + + + Other + + - botan library upgraded to 1.6.0 + + - accommodate changes in boost 1.34 + + - documentation for "mtn automate get_option" + + - notes/ directory + + + +Sat Nov 11 11:06:44 PST 2006 + + 0.31 release. Code cleanups and bug fixes. + + New features: + + - If multiple --message (or -m) arguments are passed to + 'commit', then they will be concatenated on separate lines. + + - The validate_commit_message hook is now told what branch the + commit is on. + + Bugs fixed: + + - The typo that prevented building with gcc 3.3 has been + fixed. + + - Attempting to commit without a signing key available now + fails earlier. + + - Command-line option parsing has been redone yet again; this + should fix a number of bugs caused by the use of + boost::program_options. For instance, command line error + messages are now l10nized again, "--depth=asdf" now gives a + sensible error message instead of crashing, and --key= now + works as an alternative to -k "". + + - A bug in the new roster caching logic that caused assertion + failures on very large trees has been fixed. + + - A rare bug in the "epoch refinement" phase of the netsync + protocol has been fixed. + + - Accidental (and undocumented) change to 'automate inventory' + output format reverted; documentation is now correct again. + + - Some obscure error conditions with 'pivot_root' fixed. + + Many fixes to 'automate stdio': + + - IO handling has been rewritten, to remove some + obscure bugs and clean up the code. + + - automate commands can now take options (even when used with + 'automate stdio'). + + - The default block size has been increased to 32k (which + should considerably reduce overhead). + + - Many automate commands were flushing their output far too + often, causing major slowdowns when used with 'automate + stdio'; this has been fixed. + + - Syntax errors now cause 'automate stdio' to exit, rather + than attempting to provide usage information for the calling + program to read. + + Other: + + - New large-coverage random testsuite for delta reconstruction + path finding algorithm. + + - Miscellaneous code cleanups and improved error messages. + + - Enhancements to debian packaging. + + - New translation to es (Spanish). + +Sun Sep 17 12:27:08 PDT 2006 + + 0.30 release. Speed improvements, bug fixes, and improved + infrastructure. + + Several internal data formats have changed with this release; + migration is straight-forward, but slightly more complicated + than usual: + -- The formats used to store some cached data in the + database have changed. To upgrade your databases, you + must run: + $ mtn -d mydb.mtn db migrate + $ mtn -d mydb.mtn db regenerate_rosters + -- The metadata stored in _MTN in each workspace has been + rearranged slightly. To upgrade your workspaces, you + must run + $ mtn migrate_workspace + in each workspace. + All of these operations are completely lossless, and 0.30 + remains compatible with earlier versions with regards to + netsync. + + Speed improvements: + + - Algorithm used to find branch heads rewritten, to use vastly + less memory and cpu. This not only makes 'mtn heads' + faster, but also 'mtn commit', 'mtn update', and other + commands, which were spending most of their time in this + code. + + - The format used in the database to store the roster cache + was rewritten. This makes initial pull approximately twice + as fast, and somewhat improves the speed of restricted log, + annotate, and so on. + + - The xdelta algorithm was further optimized. + + - A memory leak in Botan was fixed, which was causing + excessive memory and CPU time to be spent during 'mtn + checkout'. + + - Monotone has fast-paths for doing character set conversion + when the system it is running on uses plain ASCII. These + fast-paths now know that "646" is another name used for + ASCII, and systems that use this name (like some BSDs) now + benefit from the fast-paths. + + - Miscellaneous other improvements. + + Workspace format changes: + + - It is now possible to write down a multi-parent (merge) + workspace. However, monotone will still refuse to work with + such a workspace, and there is no way to create one. This + change merely sets up infrastructure for further changes. + + - _MTN/revision no longer contains only the parent revision + id; if you depended on this in scripts, use 'mtn automate + get_base_revision_id' instead. Also, _MTN/work has been + removed. + + UI changes: + + - 'mtn status' now includes the branch name and parent + revision id in its output. + + - The output of 'mtn annotate' and 'mtn annotate --brief' has + been switched. The more human-readable output is now the + default. + + - 'mtn pluck' now gives an error message if the requested + operation would have no effect. + + - On command line syntax errors, usage information is now + printed to stderr instead of stdout. (Output requested with + --help still goes to stdout.) This should make it easier to + find bugs in scripts. + + Bug fixes: + + - While changelog messages have always been defined to UTF-8, + we were not properly converting messages from the user's + locale. This has now been fixed. + + - An off-by-one error that caused some operations to abort + with an error message about "cancel_size < + pending_writes_size" has been fixed. + + - In 0.29, --help output was not localized. This has been + fixed. + + - In 0.29, setting merger = "emacs" would not work unless + EDITOR was also set to "emacs" (and similar for vi). This + has been fixed. + + - A rare invariant violation seen when performing certain + sequences of renames/adds in the workspace has been fixed. + + - If a user failed to resolve the conflicts in a text file, we + would continue asking them to resolve conflicts in remaining + files, even though the merge could not succeed. We now exit + immediately on failure. + + - Work around some g++ 3.3 brokenness. + + Documentation changes: + + - Imported *-merge documents into the manual (they still need + to be cleaned up to fit in better). + + Changes to automate: + + - Bug fix in 'attributes': this command is supposed to list + attributes that were removed from a file in the current + revision; instead, it was listing all attributes that had + ever been removed from that file. Now fixed. + + - New command 'get_corresponding_path': given a revision A, a + path P, and a revision B, looks up the file with name P in + revision A, and states what path it had in revision B. + + - New command 'get_content_changed': given a revision A and a + path P, gives the ancestor of A in which P was last + modified. + + - New command 'get_option': Fetches variables from + _MTN/options (e.g., the current workspace's branch and + database). + + - New command 'genkey': an automate-friendly way to generate a + new monotone key. + +Sun Aug 20 15:58:08 PDT 2006 + + 0.29 release. Code cleanups and bug fixes. + + New features: + + - The output of 'mtn status' has been changed significantly; the + output formerly used by 'mtn status --brief' has become the + default. For output similar to the old 'mtn status', see + 'mtn automate get_revision'. + + - It is now significantly easier to control what merger + monotone uses to resolve conflicts; for instance, to use + emacs to resolve conflicts, add: + merger = "emacs" + to your .monotonerc file. To override temporarily, you can + also use the environment variable MTN_MERGE, which takes the + same strings. Currently recognized strings are "kdiff3", + "xxdiff", "opendiff", "tortoisemerge", "emacs", "vim", and + "meld". + + - Formerly, monotone's sync-over-ssh support required that an + absolute path be used, with a URL like: + ssh://venge.net/home/njs/my-db.mtn + The following syntaxes are now supported as well: + ssh://venge.net/~/my-db.mtn + ssh://venge.net/~njs/my-db.mtn + + Bugs fixed: + + - The bug where monotone would sometimes respond to a control-C + (or several other signals) by locking up and refusing to exit, + has been fixed. + + - Monotone now properly respects SIGPIPE. In particular, this + means that 'mtn log | less' should now exit promptly when + 'less' is exited. + + - 'mtn log' now flushes its output after each message; this + makes 'mtn log ' significantly more usable. + + - 'mtn log ' formerly listed irrelevant revisions (in + particular, any revision which contained a delete of any files + or directories, was always included). This has been fixed. + + - If, during an update, two files both had conflicts, which, + when resolved, resulting the two files becoming identical, the + update would error out. This has been fixed. + + - If _MTN/log exists and does not end in a newline, we now add a + newline before using the log message. This removes a problem + where the string "MTN:" would end up appended to the last line + of the log message. + + - We no longer buffer up an arbitrarily large number of pending + writes in the database. This improves speed and memory usage + for 'commit', and fixes the problem where 'cvs_import' would + run out of memory. + + - Monotone's tree walking code (used by 'ls unknown', 'ls + missing', and friends) now uses much less memory, especially + on reiserfs. + + Automate changes: + + - 'mtn automate stdio' now uses a configurable block size, + controlled by command-line option --automate-stdio-size. This + is mostly useful for testing speed/memory trade-offs. + + - 'automate attributes' has a new format, which includes more + information. + + Code cleanup: + + - We now use boost::program_options to parse command line + options, rather than popt. The only user-visible change + should be that --option="" no longer works as a way to set + some option to the empty string; use --option "". (This + change also removes a lot of orphaned and historically buggy + code from monotone.) + + Other: + + - zsh completion script significantly revised and updated (see + contrib/monotone.zsh_completion). + +Sat Jul 22 01:39:51 PDT 2006 + + 0.28 release. Cherrypicking, a new testsuite, and some fixes + and enhancements. + + New features: + + - Cherrypicking with the new "pluck" command. This takes (a restricted + subset of) the changes in a revision, or between two + revisions, and applies them to your workspace. That this + has happened is not recorded in history; it as if you + happened to make some very similar changes by hand in your + workspace. + - New automate commands, "automate tags" and "automate branches". + - "diff" now knows how to find enclosing function (or + whatever) bodies, just like GNU diff's "-p" option. + -- The regex that defines "enclosing function" can be chosen + on a per-file basis by a hook function; the default hook + knows about LaTeX, Texinfo, and most programming + languages. + -- This is enabled by default; use --no-show-encloser to + disable. + + Enhancements: + + - When netsync fails due to permission errors, the server returns a + semi-intelligible message before dropping the connection. + - When merging a branch with 3 or more heads, the order in which to + merge the heads will now automatically be chosen to minimize + the amount of repeated work that must be done. + - Crash dumps are now written to $CONFDIR/dump when no workspace is + available + - Path validation routines are faster. + - Inodeprints should be slightly more robust now. + - New hook get_mtn_command, used to determine the path to the + mtn binary on a remote host, when using ssh support. + - "diff" now accepts "-u" and "-c" as short for "--unified" + (the default) and "--context", respectively. + + Bug fixes: + + - "revert --missing" now works when run in a subdirectory. + - "revert --missing" now works without any additional files + being specified. (You don't have to say "mtn revert + --missing .".) + - Fix an edge case where monotone would crash if there was a + content conflict in a merge for which there was no lca. + - Fix a case where netsync would sometimes hang during refinement. + - "mtn help" and "mtn --help" now exit with return code 0. + + Build environment: + + - automake 1.9 is now required. + - The testsuite has been rewritten, and should be much faster now. It + also no longer relies on the presence of a *nix userland. + - Add workaround for gcc 4.1.[01] bug causing "multiple + definition" errors. + + Internal: + + - Restrictions have been split into path_restrictions and + node_restrictions, and generally cleaned up more. + +Sat Jun 17 14:43:12 PDT 2006 + + 0.27 release. Minor bug fixes and enhancements, plus ssh + support. + + Major new features: + + - Monotone can now push/pull/synchronize over arbitrary + bidirectional streams, not just raw TCP. + - File-to-file synchronization is enabled out of the box, + e.g.: + $ mtn -d db1.mtn sync file:/path/to/db2.mtn + - SSH synchronization is enabled out of the box, e.g.: + $ mtn -d local.mtn sync ssh://address@hidden/home/njs/remote.mtn + Note that this requires mtn be installed on the remote + computer, and locks the remote database while running; it + is not ideal for groups accessing a shared database. + - New protocols can be defined with Lua hooks -- for + example, someone could in principle make "$ mtn sync + xmpp://address@hidden" do something interesting. + - See section "Other Transports" under "Advanced Uses" in the + for more details. + + Minor new features: + + - Selectors now support escaping, e.g., b:foo\/bar can be used + to refer to a branch with name "foo/bar" (normally / is a + metacharacter that separates multiple selectors). + - Visual C++ can now build monotone on Windows. (Mostly + important because it allows better Windows debugging.) + - --quiet now turns tickers off, and does not turn warnings + off. New option --reallyquiet disables warnings as well. + - New command 'automate common_ancestors'. + - 'ls branches' now takes a pattern, e.g.: + $ mtn ls branches "*contrib*" + + Speed improvements: + + - Bug in select() loop fixed, server should no longer pause in + processing other clients while busy with one, but multiplex + fairly. + - The database has a new write buffer which gives significant + speed improvements in initial pulls by cancelling redundant + database writes. + - There's been a fair bit of performance tuning all around. + + Bug fixes: + + - Merge tools that exit in failure are now detected. + - Better reporting of operating system errors on Win32. + - Passphrases stored in ~/.monotonerc are no longer written to + the log file. (Passphrases entered at the terminal were + never written to the log file.) + - Fix sql injection bugs in selectors, making it safe to + expose slectors in web interfaces etc. + - Files marked with the mtn:execute attr now respect umask. + - 'automate' commands on Win32 now disable newline translation + on their output; this is especially important for 'automate + stdio'. + - 'db check' now calls the sqlite "PRAGMA integrity_check", to + validate the integrity of things like sqlite indices. + - 'mtn annotate nonexistent-file' now gives a proper error + message, instead of an assertion error. + - 'mtn revert --missing' now works correctly when run in a + subdirectory. + - 'automate inventory' no longer fails when _MTN/work contains + patch stanzas. + + Other: + + - Many, many internal code cleanups + - Including changes to somewhat reduce the size of the + binary + - New tutorial on using packets added to the manual + - Updated translations, improved error messages, etc. + + Reliability considerations: + + - In the two months since 0.26 was released, zero serious bugs + have been reported in the new code. + +Sat Apr 8 19:33:35 PDT 2006 + + 0.26 release. Major enhancements and internal rewrites. + Please read these notes carefully, as significant changes are + described. In particular, you _cannot_ upgrade to 0.26 + without some attention to the migration, especially if you are + working on a project with other people. See UPGRADE for + details of this procedure. + + The changes are large enough that there were 3 pre-releases of + this code; the changes that occurred in each can be seen + below. However, for the convenience of those following + releases, all changes since 0.25 will be summarized in these + release notes. There is no need to read the pre-release notes + individually. + + Major changes since 0.25: + + - The most user-visible change is that the default name of the + monotone binary has changed to 'mtn'. So, for example, you + would now run 'mtn checkout', 'mtn diff', 'mtn commit', + etc., instead of 'monotone checkout', 'monotone diff', + 'monotone commit'. + - Similarly, the name of the workspace bookkeeping directory + has changed from "MT" to "_MTN". As workspaces will + generally be recreated when migrating to this release, + this should not cause any problems. + - Similarly, built-in attrs like 'execute' have had 'mtn:' + prepended to their names. For example, executable files + should now have the attr 'mtn:execute' set to 'true' on + them. The migration code will automatically add this + prefix; no user intervention is needed. + - Similarly, the name of the ignore file has changed from + '.mt-ignore' to '.mtn-ignore'. The migration code will + automatically rename this file; no user intervention is + needed. + - Similarly, the recommended suffix for monotone db files is + now '.mtn'. + These changes are all purely cosmetic, and have no affect on + functionality. + + - The most developer-visible change is that the data + structure for representing trees has been completely + replaced, and all related code rewritten. The new data + structure is called a 'roster'. You don't really need to + know this name; unless you are hacking on monotone or using + various debug operations, you will never see a roster. + It's mostly useful to know that when someone says something + about 'roster-enabled monotone' or the like, they're + referring to this body of new code. + + This change has a number of consequences: + - The textual format for revisions and manifests changed. + There is no conceptual change, they still contain the same + information and work the same way. The formats were + merely cleaned up to correct various problems experience + showed us, and allow various enhancements now and in the + future. However, this change means that a flag-day + migration is required. See UPGRADE for details. + - Directories are now first-class objects. You can add an + empty directory, must drop a directory if you want it to + go away, etc. + - Attrs are now first-class objects. '.mt-attrs' no longer + exists; attrs are now described directly in the manifest, + and changes to them appear directly in revisions. The + migration code will automatically convert existing + .mt-attrs files to the new first-class attrs. If you have + custom attrs, those may require special handling -- if + this is the case, then the upgrader will tell you. + - The merge code has been rewritten completely. The + interface is currently the same (though this rewrite makes + it easier to improve the interface going forward); if you + have found merging in monotone to be easy in the past, + then you will not notice anything different. If you have + run into problems, then the new merger should make your + life substantially simpler. It has full support for + renames (of both directories and files), intelligent + merging of attrs, improved handling of file content + merges. Is the first known merger implementation based on + a provably correct algorithm (the "multi-*-merge" + algorithm), has exhaustive automated tests, and generally + should give accurate, conservative merges. + - The new code is generally faster, though not yet as + fast as it could be. + + Netsync changes: + + - The default netsync port has changed 5253 to 4691. 4691 is + our official IANA-assigned port. Please adjust firewalls + appropriately. + + - Netsync code has also been largely reworked; new code should + provide better opportunities for optimizations going + forward. + + - The protocol is incompatible with earlier versions of + monotone. This should not be a surprise, since the data it + carries is also incompatible (see above)... + + New features: + + - New option --brief to 'annotate', gives somewhat more + friendly output. + + - Several enhancements to log: + - New option --next, to display descendent revisions + (rather than ancestor revisions). + - When 'log -r' is given an ambiguous selector, it now just + logs all matching revisions, instead of requiring the + selector be disambiguated. + - New option --no-files. + + - New command 'show_conflicts', performs a dry run merge. + + - New command 'ls changed'. + + - 'rename' (and its alias 'mv') now accept a broader range of + syntax: + mtn rename foo some_dir + -> renames foo to some_dir/foo + mtn rename foo bar baz some_dir + -> moves foo, bar, and baz to some_dir/foo, + some_dir/bar, and some_dir/baz + + - New hook 'validate_commit_message', which may be used to + verify that all commit messages meet arbitrary user-defined + rules. + + - New option --log, to log monotone's output to a file. + + - New option 'drop --recursive', to remove a directory and its + contents in one swoop. + + - The root dir may now be renamed. This is a somewhat exotic + feature, but has some interesting uses related to splitting + up or joining together projects; see new commands + 'pivot_root', 'merge_into_dir'. + + Minor bug fixes: + + - 'serve' with no --bind argument should now work on systems + where the C library has IPv6 support, but the kernel does + not. + + - Stricter checking on the internal version of filenames to + ensure that they are valid UTF-8. + + - If the database is in the workspace, then it is always + ignored. + + - Monotone no longer errors out when using a French (fr) + locale with a non-Unicode codeset. + + Other changes: + + - Packet commands ('rdata', 'fdata', etc.) have been moved to + 'automate'. + + - Database storage now uses sqlite's blob support; database + files should be ~1/4 smaller as a result. + + - Monotone now uses sqlite 3.3; this means that older versions + of the command line client (e.g., an 'sqlite3' command built + against sqlite version 3.2) cannot be used to poke at a + monotone 0.26 database. Solution is to upgrade your sqlite3 + program. Hopefully this is irrelevant to most users... + + - Translations updated, and 3 new translations added (de, it, + sv). + + Reliability considerations: + + - This new codebase has received much less testing under real + world conditions than the codebase used in 0.25, simply + because it is newer. It has been in active use for monotone + development since 8 January 2006, and only a small number of + bugs have been found; all bugs found so far have been very + minor, and none stood any danger of corrupting data. + Furthermore, we are much more confident in the theoretical + underpinnings of the new approach than the old, and the test + suite attempts to exhaustively exercise all new code paths. + + However, none of this is or can be a substitute for real + world experience. We advise caution in upgrading to this + version of monotone, and suggest that (especially) those who + upgrade aggressively should pay extra attention to the + monotone mailing list before and after doing so. + +Wed Mar 29 05:20:10 PST 2006 + + 0.26pre3 release. This release may be considered a "release + candidate", in that while we need to write some tests and make + sure some bugs are fixed, all features are in and we hope that + no further bug fixes will be needed either. It is still a + pre-release for testing. Do not package it. DO NOT USE THIS + RELEASE UNLESS YOU WANT TO BE A DAREDEVIL. + + But, PLEASE PLEASE TEST this release. There are some + non-trivial changes since 0.26pre2, and this is your last + chance! + + Major changes since 0.26pre2: + + - The name of the monotone binary has changed to 'mtn'. + - Similarly, the name of the bookkeeping directory in + workspaces has changed from 'MT' to '_MTN' (if you have an + existing 0.26-line workspace, just rename the MT directory + to _MTN). + - Similarly, the name of the ignore file has changed from + ".mt-ignore" to ".mtn-ignore". 'rosterify' will rename + these automatically (if you have already rosterified, you + get to rename them by hand). + - Similarly, the recommended suffix for monotone db files is + now ".mtn". + + - We now perform stricter checking to make sure that filenames + are valid UTF-8. It is in principle possible that this + stricter checking will cause histories that used to work to + break; if you have non-ascii filenames, it is strongly + recommended to test with this release. + + - Root dir renaming is now supported. See new commands + 'pivot_root', 'merge_into_dir'. + - As a side-effect, it is now possible to run 'rosterify' on + histories in which two independent lines of history were + merged. + + - The security fix released in 0.25.2 has been forward-ported + to this release; this prevents some security exposure to + people running monotone as a client on case-insensitive file + systems. + + Minor change since 0.26pre2: + + - Database now uses sqlite blobs for storage; should be ~1/4 + smaller. + - New command: show_conflicts, does a dry-run merge. + - New option 'drop --recursive', to remove a directory and all + its contents in one swoop. + - Changes to 'log': + - New option --no-files + - Including merges is again the default (i.e., it now acts + like 0.25, and not like 0.26pre2). + - When 'log -r' is given an ambiguous selector, it now just + logs all matching revisions, instead of requiring the + selector be disambiguated. + - New option --log, to log monotone output to a file. + - Netsync changes: + - Was sending far too much data in some cases; now does not. + - Several bugs that caused it to lock up fixed + - Tweak to allow 'usher' proxy to transparently redirect + based on client's protocol version, to ease migration + between incompatible protocol versions. + - Packet commands have been moved to 'automate'. + - Fixed bugs in 'db kill_rev_locally', should no longer leave + an inconsistent db behind. + - Translation updates + + Other projects receiving notable work: + + - Monotone's "dumb server" support (repo distribution over + HTTP/FTP/SFTP etc.) has been ported to 0.26, a first command + line version written, etc. + - The 'usher' netsync proxy used for hosting many databases on + a single machine has received significant cleanups, and the + 'webhost' project to provide a simple interface to shared + monotone hosting providers has received even more work. + +Sat Feb 11 13:32:51 PST 2006 + + 0.26pre2 release. Inching towards 0.26. If you are using + 0.25 or earlier, then make sure to read the very important + notes for 0.26pre1, below. In particular, like 0.26pre1, this + is a pre-release for testing. Do not package it. DO NOT USE + THIS RELEASE UNLESS YOU WANT TO BE A DAREDEVIL. + + (Though, in fact, in a month of usage, only one bug has been + found in the new history code, and it was both minor and + harmless. It has additionally been fixed.) + + Database changes: + + - SQLite 3.3.3 has been imported. 3.3 introduces a new database + format that is not backwards compatible with earlier 3.x releases. + New databases will be created using this new format. Existing + databases remain compatible, and are not converted automatically. + Existing databases can be converted by performing a database + vacuum ('monotone db execute vacuum'). + + New features: + + - New hook validate_commit_message -- use to verify that all + commit messages meet arbitrary user-defined rules. + + UI improvements: + + - rename (and mv) commands now accept a broader range of + syntax: + monotone rename foo some_dir + -> renames foo to some_dir/foo + monotone rename foo bar baz some_dir + -> moves foo, bar, and baz to some_dir/foo, + some_dir/bar, and some_dir/baz + - Print a warning if it looks like a user has made a quoting + mistake on push/pull/sync/serve (windows cmd.exe has + confusing rules here). + - New command "ls changed". + - New option "--next" to log, which displays descendents of + the start revision. + - Updating to an arbitrary revision now works again (as it did + in 0.25 and earlier). This allows one to, for instance, + switch a working copy to another head, or back up to an + earlier version, while preserving uncommitted changes. + - New option --brief to annotate, gives somewhat more friendly + output. + - Fixed bug that made ticker output from netsync inaccurate. + - In 'log', --no-merges is now the default, use --merges to + override. + - If the database is in the working copy, then it is always + ignored. + + Bugs: + + - 'serve' with no --bind should now work on systems where the + C library has IPv6 support, but the kernel does not. + - Compile fixes for GCC 4.1 pre-releases. + + Other: + - Better detection when users have not run "rosterify", and + more helpful suggestions on what to do in this case. + - Documentation, translation, error message, + etc. improvements. + - Updates to contrib/mtbrowse.sh, simple shell-based monotone + interface. + - Updates to many other contrib/ files, mostly to maintain + compatibility with monotone changes. + +Sun Jan 8 01:08:56 PST 2006 + + 0.26pre1 release. Massive rewrites, released for shakedown. + This release is also dedicated to Shweta Narayan. + + This release includes massive changes compared to 0.25. The + core versioning code has all been replaced with a completely + different mechanism. Data formats and the netsync protocol + have changed in incompatible ways. + + Migration to 0.26pre1 or later is irreversible and requires a + flag day for your project. See UPGRADE for details. Note + that we DO NOT recommend upgrading at this time; see below. + + If you have been following the development list for the last + few months, you may have heard about "rosters" -- this is the + name for the new core data structure we use. While the code + is completely different, the user experience should not be + very different. You will never see a roster, unless you are + debugging monotone itself; everything still revolves around + revisions, manifests, and certs. + + While this new code has extensive tests, because of these + incompatibilities, it has never been used for real work. The + purpose of this release is to make a version available for the + monotone developers to begin using for day-to-day work, to + shake out bugs. + + Let's say that again in caps: THIS CODE IS PROBABLY BUGGY, DO + NOT USE IT IN PRODUCTION UNLESS YOU WANT TO BE A DAREDEVIL. + + However, testing of this version with real databases is a good + idea, and we'd very much appreciate hearing about your + experiences. + + Some of the many changes: + - New textual format for revisions and manifests; they remain + conceptually the same, but have been tweaked. Manifests + now use the same "basic_io" format as everything else in + monotone, and contain entries for directories, revisions + record file adds slightly differently and record directory + adds for the first time, etc. Because of this format + change, revision hashes are now different; converting + rosters requires a full history rebuild and reissue of certs. + - Directories are now first class. To get rid of a directory + you must remove it; to create a directory, you must add it. + You can add an empty directory. + - Attrs are now first class. The .mt-attrs file is gone; + attributes are now stored directly in the manifest. + - New merge algorithm, based on "multi-*-merge", and more + aggressive, less buggy merge ancestor selection code + - Netsync's core has been largely rewritten. Code is now much + clearer and more reliable, and now includes the ability to + resume interrupted partial transfers. The netsync protocol + version number has been bumped, and netsync now runs on the + IANA-assigned port 4691 by default. + - 100% fewer change_set.cc related bugs. 100% more roster.cc + related bugs. But the idea of touching roster.cc does not + terrify people. + +Thu Dec 29 23:10:03 PST 2005 + + 0.25 release. + + Incompatible command line changes: + - 'monotone revert' now requires an argument. To revert your + entire working copy, + $ monotone revert + no longer works; instead, go to the root of your working + copy and run + $ monotone revert . + + New features: + - Netsync now supports IPv6 (where OS support exists) + + Bugs fixed: + - 'revert' gives feedback describing what it changes + - Database locking further tweaked, to allow more concurrent + access in situations where this is safe. + - On win32, ticker display was fixed, so that it no longer + prints a new line at each update. + - 'read' can now understand (and migrate) privkey packets + generated by monotone version 0.23 or earlier. + - 'log --diffs ' now prints only diffs for the given + files (previously, it would print only revisions in which + the given files changed, but would print all diffs for those + revisions). + - Win9x and WinNT 4 compatibility fixes. + + New translations: + - pt_BR + +Sat Nov 27 22:29:38 PST 2005 + + 0.24 release. + + Configuration change (Windows only): + - Configuration directory on Windows has changed. It used to + be some complicated and varying function of %HOME%, + %USERPROFILE%, %HOMEDRIVE%\%HOMEPATH%, whether you were + running in mingw/cygwin, etc. It is now, always, + %APPDATA%\monotone. For instance, if your configuration + file used to be named + ...\Documents and Settings\user\.monotone\monotonerc + it will now be named + ...\Documents and Settings\user\Application Data\monotone\monotonerc + Please rename files appropriately. + + Major key management changes: + - Private keys are no longer stored in your database. They + are stored in ~/.monotone/keys/ (Unix, OS X) or + %APPDATA%\monotone\keys\ (Windows). 'db migrate' will + automatically move your keys out of your database and into + their proper location. Consequences: + - 'genkey' no longer requires a database. Simply run it + once when you first start using monotone, even before you + have created a database. + - Running 'genkey' once will suffice to give all databases + on one computer access to your key. No more fiddling with + 'read'. + - When you want to make your key available on another + computer, simply copy over the appropriate file from your + 'keys' directory to the corresponding directory on the new + computer. + - Private keys also use a more standard on-disk envelope + encoding ("PBE-PKCS5v20(SHA-1,TripleDES/CBC)") instead of + previous ARC4. More secure, and with extra crypto karma. + + Netsync changes: + - Command line syntax for 'serve' changed; administrators WILL + have to adjust scripts. + monotone serve my.host.com "*" + becomes + monotone serve --bind=my.host.com "*" + or simply + monotone serve "*" + (to serve on the default port, on all interfaces). + - Speaking of which, we can now bind to all interfaces; run + 'serve' without passing --bind, or with passing + --bind=:port, and monotone will listen on all interfaces. + - New option '--key-to-push' for 'push', 'sync', allows + administrator to push a new user's public key into a running + server without restarting it. + - Netsync permission hooks have new defaults that read a + description of allowed access out of a standard, + basic_io-based textfile (the same stanza-based format that + revisions use). Current hooks will continue to work, but + users may prefer to transition to this format; see manual + for details. + - Between these, it is now straightforward to change + permissions and add users without restarting your server. + - Improvements to experimental "usher" facility. + + UI improvements: + - New convenience options "add --unknown", "drop --missing", + "revert --missing" do what you'd expect -- add all + non-ignored non-versioned files, drop all + deleted-but-undropped files, and restore all + deleted-but-undropped files, respectively. + - New selector "h:" to select heads of a branch. "h:" means + heads of current branch, "h:mybranch" means heads of + mybranch. + - Similarly, "b:" selector with no argument now refers to + current branch. + - Commit messages now have a blank line at the top so you can + start typing directly. + - No more obscure error messages when multiple monotone + processes attempt to access a single database at the same + time; we now fail early with a more sensible error message. + (Concurrent access has never caused database corruption; + this simply makes the corruption prevention less frustrating + for the user.) + - New handlers for SIGTERM, SIGINT to rollback database + transactions. Not visible to users (unless you're really + looking carefully). (Again, killing monotone has never been + able to cause database corruption; this simply causes the + transactions to be rolled back immediately, rather than the + next time monotone runs, which improves robustness in some + theoretical way.) + + Changes in 'automate': + - New command 'automate keys' to get information on existing + keys in basic_io format. + + Updated translations: + - fr + + Smaller changes: + - Improved handling of multibyte characters in message + displays. + - Fixes to Botan's memory allocator, to avoid pathological + slowdowns in some rare cases. + - Fix bug in delta-storage code; we were not being as aggressive + about delta-compressing files and manifests as we should + have been. + - Minor bugs fixed, error messages improved. + + - Upgrading from 0.23: You must run 'db migrate' and + provide your password, for each database. + +Fri Sep 30 02:50:05 PDT 2005 + + 0.23 release. + + Possibly incompatible changes: + - hook_note_commit and hook_note_netsync_revision_received + take a new argument containing the text of the revision that + was received. (Timothy Brownawell ) + - 'cat FILENAME' now acts like the old 'cat file REV + FILENAME'; use new commands 'automate get_revision', + 'automate get_manifest', 'automate get_file' to fetch + objects by hash. (Grahame Bowland ) + + General improvements: + - .mt-ignore support (Martin Dvorak + , Timothy Brownawell ) + - much work on making monotone more i18n friendly (Benoît + Dejean , Matt Johnston + ) + - support for more interactive merge tools: + - FileMerge.app (comes with OS X) (Marcel van der Boom + ) + - TortoiseMerge (Win32; comes with TortoiseSVN) (Matthew + Gregan ) + - rename and drop now actually perform the specified rename or + deletion when the argument --execute is passed. (Richard + Levitte ) + - 'help' command, same as --help (Matt Johnston + ). + - 'usher' support: experimental method for proxying multiple + netsync servers through a single port (similar concept to + vhosts) (Timothy Brownawell ) + - support long passphrases (Matt Johnston ) + - Faster binary file detection (Eric Anderson + ) + - netsync speedups: + - when handling large files (Eric Anderson + ) + - when handling many branches (Marcel van der Boom + ) + - new system to allow crash logs to contain not just execution + traces, but also dumps of data being handled when the error + was detected -- greatly improves debuggability of user + crashes. + - complete rework of path handling code, for clarity, + robustness, and speed. No user visible changes, except for + the many bugs fixed. (Special thanks to Matthew Gregan + and Grahame Bowland + .) + - however, if you have non-normalized paths in your history + (symptom: fresh pulls with 0.18 work, but fresh pulls with + 0.19 do not), then 0.23 will report an error and refuse to + handle the affected revisions. Since it is believed this + only affects one project, and to conserve core developer + time, implementing a migration was put off for now. If + this causes problems or for more details, please send an + email to address@hidden + - as always, many small bug fixes, speedups, and improved + messages. + + New translations: + - fr (Benoît Dejean ) + - ja (Satoru SATOH ) + + Other new monotone-related projects since 0.22: + - mtsh by Timothy Brownawell: + https://netfiles.uiuc.edu/brownawe/www/mtsh/ + GTK+ wrapper for monotone focusing on working copy + operations -- add/drop/revert/rename/commit/update/diff and + browsing. Has a mechanism for per-file commit comments. + + - "dumb server" support by Nathaniel Smith (share your + monotone repositories via HTTP/FTP, no netsync daemon + needed): + http://viewmtn.angrygoats.net//branch.psp?branch=net.venge.monotone.dumb + Still needs a command-line frontend to be usable, among + other things. Help wanted. In python. + + - m7 by Larry Hastings + http://www.midwinter.com/~lch/programming/m7/ + Experimental drop-in command-line wrapper for monotone. + Uses certs to add local incrementing version numbers, and an + enhanced annotate front-end. + +Mon Aug 8 23:23:53 PDT 2005 + + 0.22 release. new crypto library, bug fixes, ui improvements + + - switch from crypto++ to botan as underlying crypto library. + this should not cause any user-visible changes; let us know + if it does. special thanks to Matt Johnston + , Kaushik Veeraraghavan + , Matthew Gregan + . + - incompatible change to netsync permission hooks: the + get_netsync_anonymous_read_permitted hook has been removed; + instead, get_netsync_read_permitted will be called with a + key name of nil. server administrators should update/review + their configuration + - new option for merge and propagate: --lca. Until we get a + long-term solution to the various 3-way merge problems, this + should be more convenient than using explicit_merge. + - many small improvements to error messages, fixes of minor + annoyances, netsync tickers more accurate, etc. + +Sun Jul 17 16:48:26 PDT 2005 + + 0.21 release. bug fixes, performance improvements, and ui + improvements. + + - fixes a number of major performance bugs in 0.20's netsync + implementation. special thanks to Matt Johnston + . + - fixes a number of major bugs in 0.20's (rewritten) + cvs_import command. + - configury kluges to work around g++ 4.0/boost 1.32 + incompatibilities. special thanks to Christof Petig + , Matthew Gregan + , Jordan Breeding + . + - ui enhancements: + - new netsync option "--exclude": branches are included if + they match any of the given globs, unless they match any + of the given --exclude globs. special thanks to Timothy + Brownawell . + - new netsync option client "--set-default": makes it easy + to change default server/branches. + - "diff" now takes options "--context" and "--external", to + output context diffs and to invoke an external diff + program for full control over output formatting. new + option "--diff-args" pass arguments to external diff + program; new hook "external_diff" allows further + configuration. special thanks to Vladimir Vukicevic + . + - b: and t: selectors now match exactly, instead of matching + as substrings. globbing is supported for inexact + matching. special thanks to Brian Downing + , Jordan Breeding + . + - new command 'db kill_tag_locally'. special thanks to Jordan + Breeding . + - now uses sqlite3 prepared statements. special thanks to + Derek Scherger . + - 'db migrate' is now a complete no-op if there is no + migration to do; automated scripts can now call it + optimistically and cheaply to guarantee up-to-dateness. + - new hash correctness tests. special thanks to Kaushik + Veeraraghavan . + + - upgrading from 0.20: you must run 'monotone db + migrate' once against each of your databases, to add + new sql indexes. + +Tue Jul 5 23:57:10 PDT 2005 + + 0.20 release. features, ui improvements, performance + improvements, and bug fixes. + + - major changes in netsync UI: serve/sync/push/pull now take a + list of globs; clients can request arbitrary sets of + branches, not just predefined "collections". write + permissions are now granted on a per-db level (they were + before anyway). + - where you used to say, e.g., "monotone pull + net.venge.monotone", you should instead say + "monotone pull net.venge.monotone*". This may + require shell-quoting. + - 'get_netsync_write_permitted' hooks must be changed + to take only one argument, the 'identity'. + 'get_netsync_{read,anonymous_read}_permitted' hooks + now take a branch argument instead of a collection, + and will be called for each branch that a client + requests. + - 0.19 clients cannot talk to 0.20 servers, and vice-versa. + - special thanks to Timothy Brownawell + , Richard Levitte + . + - other major changes: + - cvs_import re-written; many bugs fixed. now + supports tags. + - many minor netsync changes: + - netsync traffic is now cryptographically authenticated + against corruption and man-in-the-middle attacks. + special thanks to Ethan Blanton , + Matt Johnston . + - new hooks that are called when server receives data: + note_netsync_*_received. special thanks to Timothy + Brownawell . + - ancestry graphs that pass outside the given branch + are now synchronized correctly. special thanks to + Timothy Brownawell . + - UI improvements: + - 'log' options changed: --depth has become --last; + new options --no-merges, --diffs, --brief. + - 'status' has new option --brief. special thanks to + Derek Scherger . + - 'serve' has new option --pid-file. special thanks + to Matthew Gregan . + - all commands taking restrictions now take option + --depth, to limit recursion through subdirectories. + special thanks to Joel Reed . + - merge command all take --author, --date now. + - 'checkout', 'update' take --revision, instead of + using positional arguments. special thanks to Derek + Scherger , Richard Levitte + . + - 'commit' takes new --message-file option. + - new features: + - new commands: "db kill_branch_locally", "db + kill_revision_locally", useful for correcting some + mistakes. special thanks to Brian Campbell + , Sebastian Spaeth + . + - new file attribute 'manual_merge', to prevent invocation of + merger on binary files. hook added to guess correct + value at 'add' time. special thanks to Riccardo + Ghetta . + - new 'earlier than', 'later than' selectors. special + thanks to Riccardo Ghetta . + - new automate commands: + - 'stdio', for efficient use by + front-ends. special thanks to Timothy Brownawell + . + - 'certs', for fetching certs on a revision in a + parseable (basic io-based) format. special thanks + to Grahame Bowland . + - 'inventory' output changed incompatibly; should be + much more usable now, and stable. special thanks to + Derek Scherger . + - better memory/performance when handling large files. + special thanks to Eric Anderson + , Timothy Brownawell + , Matt Johnston , + Matthew Gregan . + - new text mode browser in contrib/mtbrowse.sh, by Henry + Nestler . + - improved zsh completion in contrib/monotone.zsh_completion, + by Joel Reed . + + - upgrading from 0.19: database and working copies are + fully compatible. netsync clients and servers need + to be upgraded together, as described above. the + many ui changes may require script updates. + +Tue May 3 00:31:37 PDT 2005 + + 0.19 release. performance improvements, features, ui + improvements, and bug fixes. + + - many operations sped up by another factor of 2 or better. + - special thanks to Matt Johnston . + - first steps towards automated benchmarking. Thanks + to Timothy Brownawell . + - new major features: + - "annotate" command; still requires optimization. + Thanks to Emile Snyder . + - "inodeprints" for fast change detection in large + working dirs now fully supported; see manual for + details. + - new minor features: + - new selector "c:name=value" for selecting on + arbitrary certs. Thanks to Richard Levitte + . + - new hooks to automatically initialize attributes on + add; monotone now automatically sets execute bit on + executables. Thanks to Joel Reed + . + - new automate command "select", to do selector + expansion. Thanks to Richard Levitte + . + - new automate commands "graph", "parents", + "children", "ancestors", to easily inspect history. + Special thanks to Sebastian Spaeth + . + - new command "db kill_rev_locally". Thanks to + Sebastian Spaeth . + - new arguments to "commit": --author, --date; useful + for patch attribution and importing history. + - new automate command "inventory" (output format will + change in next release, however). Thanks to Derek + Scherger . + - ui improvements: + - netsync progress ticker in kilobytes/megabytes. + Thanks to Matt Johnston and + Sebastian Spaeth . + - tickers do not cause annoying scrolling when wider + than window. Special thanks to Matthew Gregan + . + - warn users when a commit creates divergence, and + when an update ignores it. Thanks to Jeremy Cowgar + . + - support for command-specific options (there is still + no rule that such options must appear after the + command on the command line, though). Thanks to + Richard Levitte . + - bug fixes: + - many cvs_import bugs fixed. Special thanks to Jon + Bright , Emile Snyder + , Hansjoerg Lipp + , Matthew Gregan + . + - windows/unix working copy line ending conversion now + works correctly. Thanks to Emile Snyder + . + - many fixes to i18n-ized filename support + - "drop" and "rename" now affect file attributes as + well. Thanks to Richard Levitte + and Joel Reed + . + - better error reporting in netsync. Thanks to + Grahame Bowland . + - only set working directory's default branch on some + commands (update, commit). Thanks to Florian Weimer + . + - "db check" now sets exit status correctly, for use + in scripts. Thanks to Derek Scherger + . + - many others... + - fantastic emacs integration in contrib/monotone.el. Thanks + to Harley Gorrell . + - 45 new integration tests. total line coverage: ~84%. + + - upgrading from 0.18: database and working copies are + fully compatible. NOTE that the configuration file + is now ~/.monotone/monotonerc, rather than old + ~/.monotonerc. Simply create ~/.monotone, and + rename any existing configuration file. + +Sun Apr 10 17:49:25 PDT 2005 + + 0.18 release. performance improvements, features, and bug fixes. + This release is dedicated to Shweta Narayan. + + - most operations sped up by a factor of 2 or better; many sped up + by up several orders of magnitude. + - special thanks to Matt Johnston , Derek + Scherger , Linus Torvalds + . + - new concept: "database vars". Used in several features below. + - new features: + - new file "MT/log" can be edited while you work, + sets default changelog. (no change in behaviour if + you do not edit it.) Thanks to Jeremy Cowgar + . + - monotone now stores default netsync + server/collection, initialized on first use of + netsync. + - you no longer need to manually import server + keys, monotone will fetch the key from the server on + first netsync. + - monotone keeps track of keys of servers you have + previously synced with, to prevent man-in-the-middle + attacks. + - several powerful new "automate" commands added. + - new command 'ls known', lists files that are under version + control. Thanks to Florian Weimer . + - preliminary "inodeprints" functionality -- speeds up diff, + status, etc. No UI or documentation yet -- in a working + copy, 'touch MT/inodeprints' to enable, then commit or + update to populate cache. + - UI improvements: + - Added short options -r, -b, -k, -m. + - default to 'dot' ticker-style when stderr is + not a tty, thanks to Derek Scherger + . + - New "-@/--xargs" option, helpful when using new + automate commands. Thanks to Richard Levitte + . + - New "--depth" argument to 'log'. Thanks to Richard + Levitte . + - 'db info' gives statistics on space usage. + - new command 'dropkey'. Thanks to Jeremy Cowgar + . + - robustness improvement: if monotone crashes in a working + directory and --dump and --debug were not specified, saves + debug dump to "MT/debug" for analysis, instead of + discarding. + - new contributed scripts: CIA (cia.navi.cx) notification, + email notification, Bash completion. + - 33 new integration tests. total line coverage: ~82%. + - many bug fixes + - Special thanks to Matt Johnston , + for going above and beyond to track down the last + release blocker. + + - upgrading from 0.17 requires only a 'db migrate'. + +Fri Mar 18 15:38:52 PST 2005 + + 0.17 release. bug fixes and features. + + - many, many robustness improvements + - more careful checking everywhere + - much more thorough test suite + - all revisions subject to careful checks before + entering database + - not yet fully optimized; "pull" may be very + slow and use lots of cpu + - support for "epochs", to safely manage future + rebuilds, hash migration, etc. + - new "db check" command, thanks to Derek Scherger + . + - now uses sqlite3, thanks to Christof Petig + . + - removes most former size limitations + - "restrictions" support, thanks to Derek Scherger + . + - most commands now take a list of files to limit + their actions to + - monotone can now be run from anywhere in the working + directory (not just the root) + - new command "monotone setup" required to create a + working directory for a new project + - important security fix -- don't use shell when calling + external merge commands. + - format change for "MT/options", ".mt-attrs"; you may have to + edit these files + - new command "attr" for managing .mt-attrs. + - builds merkle tries in-memory -- netsync starts up many + times faster + - start of new "automate" interface, for shell scripts and + others. + - new command "cdiff": generates context diffs. + - remove most of now-obsolete manifest/file cert support. + - 60+ new integration tests. + - many portability fixes + - in particular, major win32 cleanups, thanks to Jon + Bright . win32 is once again + fully and natively supported. + - many bug fixes + + - several incompatible changes: see file UPGRADE for + migration information + +Thu Dec 30 01:37:54 EST 2004 + + 0.16 release. bug fixes. + + - 50+ new integration tests + - many NetBSD portability fixes + - release build on gcc 3.4 / FC3 + - masses of changeset bugs in 0.15 fixed + + - some bogus changesets were generated + in the 0.16 development cycle. you will + need to rebuild revision graph. + + +Sun Nov 7 14:06:03 EST 2004 + + 0.15 release. major changes. + + - overhauled the internal representation of changes. see + README.changesets for details + - fixed bugs in merkle trie synchronization code + - fixed echoing and progress UI bugs + (helps when using in emacs) + - upgraded cryptopp to 5.2.1 + - fixed bug 8715, diff hunk coordinate reporting + - added figures, new tutorial to manual + - improve accuracy of log command + - several build, configure, and linkage fixes + - some OSX / PPC portability fixes + +Sat Jul 31 15:38:02 EDT 2004 + + 0.14 release. bug fixes. + + - some compile fixes for g++ 3.4 + - made --dump=FILE option for saving traces, + otherwise failures just print reason (no trace) + - some things disabled, as scheduled for replacement + by upcoming changeset branch work + - disabled "disapprove" command due to bad semantics + - removed "bump" and .mt-nonce machinery + - several critical rename-merging bugs fixed + - renames vs. deletes + - renames vs. deltas + - parallel renames + - bugs fixed from savannah bug tracker: + - 9223 argv overflow + - 9075 empty commits + - 8919 rename --verbose to --debug + - 8958 rename debug to db execute + - 8920 empty passphrase message + - 8917 connection refused message + - 8913 testresult argument + - 8912 passphrase read on serve + - 8472 approve into branch + - 8428 duplicate key warning + - 8928 nonce uses too many bits + +Thu May 20 22:26:27 EDT 2004 + + 0.13 release. bug fixes. + + - remove (file|manifest) in several commands + - "list missing" command + - fixed bugs: + - (critical) empty data netsync crash + - mkstemp, platform lua + - runtime error reporting chatter + - non-posix database names + - non-posix dirnames + - non-posix merge names + - 2-way merge algorithm and hook + - single-character filenames + - multiple password reads + - .svn ignore pattern + +Sun May 2 21:03:38 EDT 2004 + + 0.12 release. win32 port, bug fixes and optimizations. + + - ported to native win32 (mingw) + - implemented human friendly version selectors + - added post-commit hook for change notification + - removed spirit-based parsers, reduced compile costs + - many netsync bugs removed, pipeline performance improved + - removed old, deprecated networking system + - several minor CVS import bugs fixed + - upgraded bundled netxx + +Sun Mar 28 12:41:07 EST 2004 + + 0.11 release. bug fixes and optimizations. + + NOTE: this release expands the sqlite page size. YOU WILL NEED + to dump existing databases before upgrading and reload it + after upgrading, otherwise monotone will complain that the + database image appears malformed. this condition cannot + unfortunately be distinguished from a real malformed image on + disk. for example: + + $ monotone --db=my.db db dump >dump.sql + $ + $ mv my.db my.db.backup + $ monotone --db=my.db db load 8k + +Mon Mar 1 00:32:07 EST 2004 + + 0.10 release. new "netsync" protocol implemented, allowing + direct monotone-to-monotone database synchronization. random + number underflow problem fixed. more tests added. database + schema changed, must migrate schema. added new QA logic to + update and merge algorithms (testresult / approval). + +Thu Jan 1 18:23:06 EST 2004 + + 0.9 release. support international users (non-ASCII character + sets, locales). some corrections to update algorithm. line + merging algorithm reimplemented. support working copy + MT/monotonerc file. broke format compatibility with MT/work + files; commit any pending work before upgrading. permit + spaces, colons, other "funny" characters in filenames. support + HTTP 1.1, HTTP proxies, handle some corner cases in ancestry + graph and database faults. + +Fri Nov 21 20:25:26 EST 2003 + + 0.8 release. row size increased to 16mb. more performance + improvements in cvs importer. cvs branch tags imported now. + minor UI improvements. new commands: SQL dump and load, vcheck + for enhanced collision detection, queue addtree for recursive + queueing. improved networking scalability. historical rename + certs and .mt-attrs file format changed to accomodate upcoming + i18n work. + +Sun Nov 2 23:38:09 EST 2003 + + 0.7 release. many critical merge and patch set calculation + bugs fixed. groups merged with URLs, "monotone db migrate" + necessary. directory renames and explicit rename certs + supported. added SMTP support. incorporated adns library, + avoiding gethostbyname(). new queue commands. + +Sat Oct 18 22:10:09 EDT 2003 + + 0.6 release. more stability and bug fixing, including fix to + some silent failures in LCA calculation. some minor new + features: persistent attributes (eg. 'the execute bit'), + rename and log commands. performance of cvs importer greatly + improved, lua system upgraded to 5.0, much expanded + documentation. + +Sat Sep 27 11:50:08 EDT 2003 + + 0.5 release. stability and bug fixing. many UI issues + addressed, including SHA1 completion, persistent options, new + revert command and new diff modes. database migration, + inspection and debugging interfaces added. LCS algorithm and + line-merger overhauled. several multi-depot bugs + fixed. existing depot databases should be migrated (depot.cgi + migratedb). + +Thu Sep 4 15:40:07 EDT 2003 + + 0.4 release. monotone is now self-hosting. database + compatibility broken since 0.3. depot uses RSA signatures now, + not mac keys. many bugs removed. depot database compatibility + broken. database schemas should now remain stable (or be + provided with safe schema-upgrading function). + +Mon Aug 25 18:00:37 EDT 2003 + + 0.3 release. database compatibility broken. packet format + compatibility broken. dropped boost sandbox library dependency. + redid networking to support private HTTP+CGI depots along with + netnews. wrote depot. added 'propagate' command to move changes + between branches asymmetrically. rewrote testsuite in autotest. + cleaned up command line processing. expanded testsuite. improved + user-friendly error reporting. + +Fri Aug 8 10:20:01 EDT 2003 + + 0.2 release. database compatibility broken. dropped many + library dependencies. hand-reimplemented xdelta, parts of + nana. incorporated subset of cryptopp and sqlite into + sources. added RCS and CVS importer. switched to piecewise + reconstruction. generally much more robust storage system. + scalability tests against real world CVS archives show + performance gap with CVS closing, but still present. + +Sun Apr 6 20:20:42 EDT 2003 + + initial release --- cmd.cc +++ cmd.cc @@ -0,0 +1,659 @@ +// Copyright (C) 2002 Graydon Hoare +// 2007 Julio M. Merino Vidal +// +// This program is made available under the GNU GPL version 2.0 or +// greater. See the accompanying file COPYING for details. +// +// This program is distributed WITHOUT ANY WARRANTY; without even the +// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +// PURPOSE. + +#include "base.hh" +#include "cmd.hh" + +#include "lua.hh" +#include "app_state.hh" +#include "globish.hh" +#include "options_applicator.hh" +#include "work.hh" +#include "ui.hh" +#include "mt_version.hh" +#include "charset.hh" +#include "simplestring_xform.hh" +#include "vocab_cast.hh" + +#ifndef _WIN32 +#include +#endif + +using std::string; +using std::vector; +using std::ostream; +using std::make_pair; +using std::set; + +// +// Definition of top-level commands, used to classify the real commands +// in logical groups. +// +// These top level commands, while part of the final identifiers and defined +// as regular command groups, are handled separately. The user should not +// see them except through the help command. +// +// XXX This is to easily maintain compatibilty with older versions. But +// maybe this should be revised, because exposing the top level category +// (being optional, of course), may not be a bad idea. +// + +CMD_GROUP(__root__, "__root__", "", NULL, "", ""); + +CMD_GROUP_NO_COMPLETE(automation, "automation", "", CMD_REF(__root__), + N_("Commands that aid in scripted execution"), + ""); +CMD_GROUP(database, "database", "", CMD_REF(__root__), + N_("Commands that manipulate the database"), + ""); +CMD_GROUP(debug, "debug", "", CMD_REF(__root__), + N_("Commands that aid in program debugging"), + ""); +CMD_GROUP(informative, "informative", "", CMD_REF(__root__), + N_("Commands for information retrieval"), + ""); +CMD_GROUP(key_and_cert, "key_and_cert", "", CMD_REF(__root__), + N_("Commands to manage keys and certificates"), + ""); +CMD_GROUP(network, "network", "", CMD_REF(__root__), + N_("Commands that access the network"), + ""); +CMD_GROUP(packet_io, "packet_io", "", CMD_REF(__root__), + N_("Commands for packet reading and writing"), + ""); +CMD_GROUP(vcs, "vcs", "", CMD_REF(__root__), + N_("Commands for interaction with other version control systems"), + ""); +CMD_GROUP(review, "review", "", CMD_REF(__root__), + N_("Commands to review revisions"), + ""); +CMD_GROUP(tree, "tree", "", CMD_REF(__root__), + N_("Commands to manipulate the tree"), + ""); +CMD_GROUP(variables, "variables", "", CMD_REF(__root__), + N_("Commands to manage persistent variables"), + ""); +CMD_GROUP(workspace, "workspace", "", CMD_REF(__root__), + N_("Commands that deal with the workspace"), + ""); +CMD_GROUP(user, "user", "", CMD_REF(__root__), + N_("Commands defined by the user"), + ""); + +namespace commands { + + void remove_command_name_from_args(command_id const & ident, + args_vector & args, + size_t invisible_length) + { + MM(ident); + MM(args); + MM(invisible_length); + I(ident.empty() || args.size() >= ident.size() - invisible_length); + for (args_vector::size_type i = invisible_length; i < ident.size(); i++) + { + I(ident[i]().find(args[0]()) == 0); + args.erase(args.begin()); + } + } + + void reapply_options(app_state & app, + command const * cmd, + command_id const & cmd_ident, + command const * subcmd, + command_id const & subcmd_full_ident, + size_t subcmd_invisible_length, + args_vector const & subcmd_cmdline, + vector > const * const separate_params) + { + I(cmd); + options::opts::all_options().instantiate(&app.opts).reset(); + + cmd->preset_options(app.opts); + + option::concrete_option_set optset + = (options::opts::globals() | cmd->opts()) + .instantiate(&app.opts); + + optset.from_command_line(app.reset_info.default_args); + + if (subcmd) + { + args_vector subcmd_defaults; + app.lua.hook_get_default_command_options(subcmd_full_ident, + subcmd_defaults); + (options::opts::globals() | subcmd->opts()) + .instantiate(&app.opts) + .from_command_line(subcmd_defaults); + } + + // at this point we process the data from _MTN/options if + // the command needs it. + if ((subcmd ? subcmd : cmd)->use_workspace_options()) + { + workspace::check_format(); + workspace::get_options(app.opts); + } + + optset.from_command_line(app.reset_info.cmdline_args); + + if (subcmd) + { + app.opts.args.clear(); + option::concrete_option_set subcmd_optset + = (options::opts::globals() | subcmd->opts()) + .instantiate(&app.opts); + if (!separate_params) + { + /* the first argument here is only ever modified if the second is 'true' */ + subcmd_optset.from_command_line(const_cast(subcmd_cmdline)); + } + else + { + subcmd_optset.from_key_value_pairs(*separate_params); + app.opts.args = subcmd_cmdline; + } + remove_command_name_from_args(subcmd_full_ident, app.opts.args, + subcmd_invisible_length); + } + else + { + remove_command_name_from_args(cmd_ident, app.opts.args); + } + } + + // monotone.cc calls this function after option processing. + void process(app_state & app, command_id const & ident, + args_vector const & args) + { + static bool process_called(false); + I(!process_called); + process_called = true; + + command const * cmd = CMD_REF(__root__)->find_command(ident); + app.reset_info.cmd = cmd; + + string visibleid = join_words(vector< utf8 >(ident.begin() + 1, + ident.end()))(); + + I(cmd->is_leaf() || cmd->is_group()); + E(!(cmd->is_group() && cmd->parent() == CMD_REF(__root__)), + origin::user, + F("command '%s' is invalid; it is a group") % join_words(ident)); + + if (!cmd->is_leaf()) + { + // args used in the command name have not been stripped yet + remove_command_name_from_args(ident, app.opts.args); + + E(!args.empty(), origin::user, + F("no subcommand specified for '%s'") % visibleid); + + E(false, origin::user, + F("could not match '%s' to a subcommand of '%s'") % + join_words(args) % visibleid); + } + + L(FL("executing command '%s'") % visibleid); + + reapply_options(app, cmd, ident); + + // intentional leak + // we don't want the options to be reset, so don't destruct this + new options_applicator(app.opts, options_applicator::for_primary_cmd); + + cmd->exec(app, ident, args); + } + + // Prints the abstract description of the given command or command group + // properly indented. The tag starts at column two. The description has + // to start, at the very least, two spaces after the tag's end position; + // this is given by the colabstract parameter. + static void describe(const string & tag, const string & abstract, + const string & subcommands, size_t colabstract, + ostream & out) + { + I(colabstract > 0); + + size_t col = 0; + out << " " << tag << " "; + col += display_width(utf8(tag + " ", origin::internal)); + + out << string(colabstract - col, ' '); + col = colabstract; + string desc(abstract); + if (!subcommands.empty()) + { + desc += " (" + subcommands + ')'; + } + out << format_text(desc, colabstract, col) << '\n'; + } + + class cmd_ptr_compare + { + public: + bool operator()(command const * const a, command const * const b) const + { + return a->primary_name()() < b->primary_name()(); + } + }; + + static void explain_children(command::children_set const & children, + bool show_hidden_commands, + ostream & out) + { + I(!children.empty()); + + vector< command const * > sorted; + + size_t colabstract = 0; + for (command::children_set::const_iterator i = children.begin(); + i != children.end(); i++) + { + command const * child = *i; + + if (child->hidden() && !show_hidden_commands) + continue; + + size_t len = display_width(join_words(child->names(), ", ")) + + display_width(utf8(" ")); + if (colabstract < len) + colabstract = len; + + sorted.push_back(child); + } + + sort(sorted.begin(), sorted.end(), cmd_ptr_compare()); + + for (vector< command const * >::const_iterator i = sorted.begin(); + i != sorted.end(); i++) + { + command const * child = *i; + describe(join_words(child->names(), ", ")(), child->abstract(), + join_words(child->subcommands(show_hidden_commands), ", ")(), + colabstract, out); + } + } + + static command const * + find_command(command_id const & ident) + { + command const * cmd = CMD_REF(__root__)->find_command(ident); + + // This function is only used internally with an identifier returned + // by complete_command. Therefore, it must always exist. + I(cmd != NULL); + + return cmd; + } + + static void explain_cmd_usage(command_id const & ident, + bool show_hidden_commands, + ostream & out) + { + I(ident.size() >= 1); + + vector< string > lines; + command const * cmd = find_command(ident); + + string visibleid = join_words(vector< utf8 >(ident.begin() + 1, + ident.end()))(); + + // Print command parameters. + string params = cmd->params(); + split_into_lines(params, lines); + + if (visibleid.empty()) + out << format_text(F("Commands in group '%s':") % + join_words(ident)()) + << "\n\n"; + else + { + if (!cmd->children().empty()) + out << format_text(F("Subcommands of '%s %s':") % + prog_name % visibleid) + << "\n\n"; + else if (!lines.empty()) + out << format_text(F("Syntax specific to '%s %s':") % + prog_name % visibleid) + << "\n\n"; + } + + // lines might be empty, but only when specific syntax is to be + // displayed, not in the other cases. + if (!lines.empty()) + { + for (vector::const_iterator j = lines.begin(); + j != lines.end(); ++j) + out << " " << visibleid << ' ' << *j << '\n'; + out << '\n'; + } + + // Explain children, if any. + if (!cmd->is_leaf()) + { + explain_children(cmd->children(), show_hidden_commands, out); + out << '\n'; + } + + // Print command description. + if (visibleid.empty()) + out << format_text(F("Purpose of group '%s':") % + join_words(ident)()) + << "\n\n"; + else + out << format_text(F("Description for '%s %s':") % + prog_name % visibleid) + << "\n\n"; + out << format_text(cmd->desc(), 2) << "\n\n"; + + // Print all available aliases. + if (cmd->names().size() > 1) + { + command::names_set othernames = cmd->names(); + othernames.erase(ident[ident.size() - 1]); + out << format_text(F("Aliases: %s.") % + join_words(othernames, ", ")(), 2) + << '\n'; + } + } + + void explain_usage(command_id const & ident, + bool show_hidden_commands, + ostream & out) + { + command const * cmd = find_command(ident); + + if (ident.empty()) + { + out << format_text(F("Command groups:")) << "\n\n"; + explain_children(CMD_REF(__root__)->children(), + show_hidden_commands, + out); + out << '\n' + << format_text(F("For information on a specific command, type " + "'mtn help [subcommand_name ...]'.")) + << "\n\n" + << format_text(F("To see more details about the commands of a " + "particular group, type 'mtn help '.")) + << "\n\n" + << format_text(F("Note that you can always abbreviate a command " + "name as long as it does not conflict with other " + "names.")) + << "\n"; + } + else + explain_cmd_usage(ident, show_hidden_commands, out); + } + + options::options_type command_options(command_id const & ident) + { + command const * cmd = find_command(ident); + return cmd->opts(); + } + + // Lua-defined user commands. + class cmd_lua : public command + { + lua_State *st; + std::string const f_name; + public: + cmd_lua(std::string const & primary_name, + std::string const & params, + std::string const & abstract, + std::string const & desc, + lua_State *L_st, + std::string const & func_name) : + command(primary_name, "", CMD_REF(user), false, false, params, + abstract, desc, true, + options::options_type() | options::opts::none, true), + st(L_st), f_name(func_name) + { + // because user commands are inserted after the normal + // initialisation process + CMD_REF(user)->children().insert(this); + } + + void exec(app_state & app, command_id const & execid, + args_vector const & args) const + { + I(st); + I(app.lua.check_lua_state(st)); + + app_state* app_p = get_app_state(st); + I(app_p == & app); + + Lua ll(st); + ll.func(f_name); + + for (args_vector::const_iterator it = args.begin(); + it != args.end(); ++it) + ll.push_str((*it)()); + + app.mtn_automate_allowed = true; + + ll.call(args.size(),0); + + app.mtn_automate_allowed = false; + + E(ll.ok(), origin::user, + F("Call to user command %s (lua command: %s) failed.") + % primary_name() % f_name); + } + }; +} + +LUAEXT(alias_command, ) +{ + const char *old_cmd = luaL_checkstring(LS, -2); + const char *new_cmd = luaL_checkstring(LS, -1); + E(old_cmd && new_cmd, origin::user, + F("%s called with an invalid parameter") % "alias_command"); + + args_vector args; + args.push_back(arg_type(old_cmd, origin::user)); + commands::command_id id = commands::complete_command(args); + commands::command *old_cmd_p = CMD_REF(__root__)->find_command(id); + + old_cmd_p->add_alias(utf8(new_cmd)); + + lua_pushboolean(LS, true); + return 1; +} + + +LUAEXT(register_command, ) +{ + const char *cmd_name = luaL_checkstring(LS, -5); + const char *cmd_params = luaL_checkstring(LS, -4); + const char *cmd_abstract = luaL_checkstring(LS, -3); + const char *cmd_desc = luaL_checkstring(LS, -2); + const char *cmd_func = luaL_checkstring(LS, -1); + + E(cmd_name && cmd_params && cmd_abstract && cmd_desc && cmd_func, + origin::user, + F("%s called with an invalid parameter") % "register_command"); + + // leak this - commands can't be removed anyway + new commands::cmd_lua(cmd_name, cmd_params, cmd_abstract, cmd_desc, + LS, cmd_func); + + lua_pushboolean(LS, true); + return 1; +} + +// Miscellaneous commands and related functions for which there is no +// better file. + +CMD_NO_WORKSPACE(help, "help", "", CMD_REF(informative), + N_("command [ARGS...]"), + N_("Displays help about commands and options"), + "", + options::opts::show_hidden_commands) +{ + if (args.size() < 1) + { + app.opts.help = true; + throw usage(command_id()); + } + + command_id id = commands::complete_command(args); + app.opts.help = true; + throw usage(id); +} + +CMD_NO_WORKSPACE(version, "version", "", CMD_REF(informative), "", + N_("Shows the program version"), + "", + options::opts::full) +{ + E(args.empty(), origin::user, + F("no arguments allowed")); + + if (app.opts.full) + print_full_version(); + else + print_version(); +} + +CMD_HIDDEN(check_globish, "check_globish", "", CMD_REF(debug), + "globish string", + N_("Check that a particular globish matches a particular string"), + "", + options::opts::none) +{ + globish g = typecast_vocab(idx(args,0)); + string s(idx(args,1)()); + + E(g.matches(s), origin::user, + F("Globish <%s> does not match string <%s>") % g % s); +} + +CMD_HIDDEN(crash, "crash", "", CMD_REF(debug), + "{ N | E | I | double-throw | exception | signal }", + N_("Triggers the specified kind of crash"), + "", + options::opts::none) +{ + if (args.size() != 1) + throw usage(execid); + bool spoon_exists(false); + if (idx(args,0)() == "N") + E(spoon_exists, origin::user, i18n_format("There is no spoon.")); + else if (idx(args,0)() == "E") + E(spoon_exists, origin::system, i18n_format("There is no spoon.")); + else if (idx(args,0)() == "I") + { + I(spoon_exists); + } + else if (idx(args,0)() == "double-throw") + { + // This code is rather picky, for example I(false) in the destructor + // won't always work like it should; see http://bugs.debian.org/516862 + class throwing_dtor + { + public: + throwing_dtor() {} + ~throwing_dtor() + { + throw std::exception(); + } + }; + throwing_dtor td; + throw std::exception(); + } +#define maybe_throw(ex) if(idx(args,0)()==#ex) throw ex("There is no spoon.") +#define maybe_throw_bare(ex) if(idx(args,0)()==#ex) throw ex() + else maybe_throw_bare(std::bad_alloc); + else maybe_throw_bare(std::bad_cast); + else maybe_throw_bare(std::bad_typeid); + else maybe_throw_bare(std::bad_exception); + else maybe_throw_bare(std::exception); + else maybe_throw(std::domain_error); + else maybe_throw(std::invalid_argument); + else maybe_throw(std::length_error); + else maybe_throw(std::out_of_range); + else maybe_throw(std::range_error); + else maybe_throw(std::overflow_error); + else maybe_throw(std::underflow_error); + else maybe_throw(std::logic_error); + else maybe_throw(std::runtime_error); + else + { +#ifndef _WIN32 + try + { + int signo = boost::lexical_cast(idx(args,0)()); + if (0 < signo && signo <= 15) + { + raise(signo); + // control should not get here... + I(!"crash: raise returned"); + } + } + catch (boost::bad_lexical_cast&) + { // fall through and throw usage + } +#endif + throw usage(execid); + } +#undef maybe_throw +#undef maybe_throw_bare +} + +// There isn't really a better place for this function. + +void +process_commit_message_args(options const & opts, + bool & given, + utf8 & log_message, + utf8 const & message_prefix) +{ + // can't have both a --message and a --message-file ... + E(!opts.message_given || !opts.msgfile_given, origin::user, + F("--message and --message-file are mutually exclusive")); + + if (opts.message_given) + { + string msg; + join_lines(opts.message, msg); + log_message = utf8(msg, origin::user); + if (!opts.no_prefix && message_prefix().length() != 0) + log_message = utf8(message_prefix() + "\n\n" + log_message(), + origin::user); + given = true; + } + else if (opts.msgfile_given) + { + data dat; + read_data_for_command_line(opts.msgfile, dat); + external dat2 = typecast_vocab(dat); + system_to_utf8(dat2, log_message); + if (!opts.no_prefix && message_prefix().length() != 0) + log_message = utf8(message_prefix() + "\n\n" + log_message(), + origin::user); + given = true; + } + else if (message_prefix().length() != 0) + { + log_message = message_prefix; + given = true; + } + else + given = false; +} + +// Local Variables: +// mode: C++ +// fill-column: 76 +// c-file-style: "gnu" +// indent-tabs-mode: nil +// End: +// vim: et:sw=2:sts=2:ts=2:cino=>2s,{s,\:s,+s,t0,g0,^-2,e-2,n-2,p2s,(0,=s: --- globish.cc +++ globish.cc @@ -0,0 +1,558 @@ +// Copyright (C) 2005 Nathaniel Smith +// 2007 Zack Weinberg +// +// This program is made available under the GNU GPL version 2.0 or +// greater. See the accompanying file COPYING for details. +// +// This program is distributed WITHOUT ANY WARRANTY; without even the +// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +// PURPOSE. + +#include "base.hh" +#include "sanity.hh" +#include "globish.hh" +#include "option.hh" // for arg_type +#include "numeric_vocab.hh" + +#include +#include + +using std::string; +using std::vector; +using std::back_inserter; +using std::back_insert_iterator; + +// The algorithm here is originally from pdksh 5. That implementation uses +// the high bit of unsigned chars as a quotation flag. We can't do that, +// because we need to be utf8 clean. Instead, we copy the string and +// replace "live" metacharacters with single bytes from the +// control-character range. This is why bytes <= 0x1f are not allowed in the +// pattern. + +enum metachar { + META_STAR = 1, // * + META_QUES, // ? + META_CC_BRA, // [ + META_CC_INV_BRA, // [^ or [! + META_CC_KET, // ] (matches either of the above two) + META_ALT_BRA, // { + META_ALT_OR, // , (when found inside unquoted { ... }) + META_ALT_KET, // } +}; + +// Compile a character class. + +static string::const_iterator +compile_charclass(string const & pat, string::const_iterator p, + back_insert_iterator & to, + origin::type made_from) +{ + string in_class; + char bra = (char)META_CC_BRA; + + p++; + E(p != pat.end(), made_from, + F("invalid pattern '%s': unmatched '['") % pat); + + if (*p == '!' || *p == '^') + { + bra = (char)META_CC_INV_BRA; + p++; + E(p != pat.end(), made_from, + F("invalid pattern '%s': unmatched '['") % pat); + } + + while (p != pat.end() && *p != ']') + { + if (*p == '\\') + { + p++; + if (p == pat.end()) + break; + } + // A dash at the beginning or end of the pattern is literal. + else if (*p == '-' + && !in_class.empty() + && p+1 != pat.end() + && p[1] != ']') + { + p++; + if (*p == '\\') + p++; + if (p == pat.end()) + break; + + // the cast is needed because boost::format will not obey the %x + // if given a 'char'. + E((widen(*p)) >= ' ', made_from, + F("invalid pattern '%s': control character 0x%02x is not allowed") + % pat % (widen(*p))); + + unsigned int start = widen(in_class.end()[-1]); + unsigned int stop = widen(*p); + + E(start != stop, made_from, + F("invalid pattern '%s': " + "one-element character ranges are not allowed") % pat); + E(start < stop, made_from, + F("invalid pattern '%s': " + "endpoints of a character range must be in " + "ascending numeric order") % pat); + E(start < 0x80 && stop < 0x80, made_from, + F("invalid pattern '%s': cannot use non-ASCII characters " + "in classes") % pat); + + L(FL("expanding range from %X (%c) to %X (%c)") + % (start+1) % (char)(start+1) % stop % (char)stop); + + for (unsigned int r = start + 1; r < stop; r++) + in_class.push_back((char)r); + } + else + E(*p != '[', made_from, + F("syntax error in '%s': " + "character classes may not be nested") % pat); + + E((widen(*p)) >= ' ', made_from, + F("invalid pattern '%s': control character 0x%02x is not allowed") + % pat % (widen(*p))); + + E((widen(*p)) < 0x80, made_from, + F("invalid pattern '%s': cannot use non-ASCII characters in classes") + % pat); + + in_class.push_back(*p); + p++; + } + + E(p != pat.end(), made_from, + F("invalid pattern '%s': unmatched '['") % pat); + + E(!in_class.empty(), made_from, + F("invalid pattern '%s': empty character class") % pat); + + // minor optimization: one-element non-inverted character class becomes + // the character. + if (bra == (char)META_CC_BRA && in_class.size() == 1) + *to++ = in_class[0]; + else + { + *to++ = bra; + std::sort(in_class.begin(), in_class.end()); + std::copy(in_class.begin(), in_class.end(), to); + *to++ = (char)META_CC_KET; + } + return p; +} + +// Compile one fragment of a glob pattern. + +static void +compile_frag(string const & pat, back_insert_iterator & to, + origin::type made_from) +{ + unsigned int brace_depth = 0; + + for (string::const_iterator p = pat.begin(); p != pat.end(); p++) + switch (*p) + { + default: + E((widen(*p)) >= ' ', made_from, + F("invalid pattern '%s': control character 0x%02x is not allowed") + % pat % (widen(*p))); + + *to++ = *p; + break; + + case '*': + // optimization: * followed by any sequence of ?s and *s is + // equivalent to the number of ?s that appeared in the sequence, + // followed by a single star. the latter can be matched without + // nearly as much backtracking. + + for (p++; p != pat.end(); p++) + { + if (*p == '?') + *to++ = META_QUES; + else if (*p != '*') + break; + } + + p--; + *to++ = META_STAR; + break; + + case '?': + *to++ = META_QUES; + break; + + case '\\': + p++; + E(p != pat.end(), made_from, + F("invalid pattern '%s': un-escaped \\ at end") % pat); + + E((widen(*p)) >= ' ', made_from, + F("invalid pattern '%s': control character 0x%02x is not allowed") + % pat % (widen(*p))); + + *to++ = *p; + break; + + case '[': + p = compile_charclass(pat, p, to, made_from); + break; + + case ']': + E(false, made_from, F("invalid pattern '%s': unmatched ']'") % pat); + + case '{': + // There's quite a bit of optimization we could be doing on + // alternatives, but it's hairy, especially if you get into + // nested alternatives; so we're not doing any of it now. + // (Look at emacs's regexp-opt.el for inspiration.) + brace_depth++; + E(brace_depth < 6, made_from, + F("invalid pattern '%s': braces nested too deeply") % pat); + *to++ = META_ALT_BRA; + break; + + case ',': + if (brace_depth > 0) + *to++ = META_ALT_OR; + else + *to++ = ','; + break; + + case '}': + E(brace_depth > 0, made_from, + F("invalid pattern '%s': unmatched '}'") % pat); + brace_depth--; + *to++ = META_ALT_KET; + break; + } + + E(brace_depth == 0, made_from, + F("invalid pattern '%s': unmatched '{'") % pat); +} + +// common code used by the constructors. + +static inline string +compile(string const & pat, origin::type made_from) +{ + string s; + back_insert_iterator to = back_inserter(s); + compile_frag(pat, to, made_from); + return s; +} + +static inline string +compile(vector::const_iterator const & beg, + vector::const_iterator const & end) +{ + if (end - beg == 0) + return ""; + if (end - beg == 1) + return compile((*beg)(), origin::user); + + string s; + back_insert_iterator to = back_inserter(s); + + *to++ = META_ALT_BRA; + vector::const_iterator i = beg; + for (;;) + { + compile_frag((*i)(), to, origin::user); + i++; + if (i == end) + break; + *to++ = META_ALT_OR; + } + *to++ = META_ALT_KET; + return s; +} + +globish::globish(string const & p, origin::type made_from) + : origin_aware(made_from), + compiled_pattern(compile(p, made_from)) {} +globish::globish(char const * p, origin::type made_from) + : origin_aware(made_from), + compiled_pattern(compile(p, made_from)) {} + +globish::globish(vector const & p) + : origin_aware(origin::user), + compiled_pattern(compile(p.begin(), p.end())) {} +globish::globish(vector::const_iterator const & beg, + vector::const_iterator const & end) + : origin_aware(origin::user), + compiled_pattern(compile(beg, end)) {} + +// Debugging. + +static string +decode(string::const_iterator p, string::const_iterator end) +{ + string s; + for (; p != end; p++) + switch (*p) + { + case META_STAR: s.push_back('*'); break; + case META_QUES: s.push_back('?'); break; + case META_CC_BRA: s.push_back('['); break; + case META_CC_KET: s.push_back(']'); break; + case META_CC_INV_BRA: s.push_back('['); + s.push_back('!'); break; + + case META_ALT_BRA: s.push_back('{'); break; + case META_ALT_KET: s.push_back('}'); break; + case META_ALT_OR: s.push_back(','); break; + + // Some of these are only special in certain contexts, + // but it does no harm to escape them always. + case '[': case ']': case '-': case '!': case '^': + case '{': case '}': case ',': + case '*': case '?': case '\\': + s.push_back('\\'); + // fall through + default: + s.push_back(*p); + } + return s; +} + +string +globish::operator()() const +{ + return decode(compiled_pattern.begin(), compiled_pattern.end()); +} + +bool +globish::contains_meta_chars() const +{ + string::const_iterator p = compiled_pattern.begin(); + for (; p != compiled_pattern.end(); p++) + switch (*p) + { + case META_STAR: + case META_QUES: + case META_CC_BRA: + case META_CC_KET: + case META_CC_INV_BRA: + case META_ALT_BRA: + case META_ALT_KET: + case META_ALT_OR: + return true; + } + return false; +} + +template <> void dump(globish const & g, string & s) +{ + s = g(); +} + +std::ostream & operator<<(std::ostream & o, globish const & g) +{ + return o << g(); +} + +// Matching. + +static string::const_iterator +find_next_subpattern(string::const_iterator p, + string::const_iterator pe, + bool want_alternatives) +{ + L(FL("Finding subpattern in '%s'") % decode(p, pe)); + unsigned int depth = 1; + for (; p != pe; p++) + switch (*p) + { + default: + break; + + case META_ALT_BRA: + depth++; + break; + + case META_ALT_KET: + depth--; + if (depth == 0) + return p+1; + break; + + case META_ALT_OR: + if (depth == 1 && want_alternatives) + return p+1; + break; + } + + I(false); +} + + +static bool +do_match(string::const_iterator sb, string::const_iterator se, + string::const_iterator p, string::const_iterator pe) +{ + unsigned int sc, pc; + string::const_iterator s(sb); + + L(FL("subpattern: '%s' against '%s'") % string(s,se) % decode(p,pe)); + + while (p < pe) + { + // pc will be the current pattern character + // p will point after pc + pc = widen(*p++); + // sc will be the current string character + // s will point to sc + if(s < se) { + sc = widen(*s); + } else { + sc = 0; + } + switch (pc) + { + default: // literal + if (sc != pc) + return false; + break; + + case META_QUES: // any single character + if (sc == 0) + return false; + break; + + case META_CC_BRA: // any of these characters + { + bool matched = false; + I(p < pe); + I(*p != META_CC_KET); + do + { + if (widen(*p) == sc) + matched = true; + p++; + I(p < pe); + } + while (*p != META_CC_KET); + if (!matched) + return false; + } + p++; + break; + + case META_CC_INV_BRA: // any but these characters + I(p < pe); + I(*p != META_CC_KET); + do + { + if (widen(*p) == sc) + return false; + p++; + I(p < pe); + } + while (*p != META_CC_KET); + p++; + break; + + case META_STAR: // zero or more arbitrary characters + if (p == pe) + return true; // star at end always matches, if we get that far + + pc = widen(*p); + // If the next character in p is not magic, we can only match + // starting from places in s where that character appears. + if (pc >= ' ') + { + L(FL("after *: looking for '%c' in '%s'") + % (char)pc % string(s, se)); + p++; + for (;;) + { + ++s; + if (sc == pc && do_match(s, se, p, pe)) + return true; + if (s >= se) + break; + sc = widen(*s); + } + } + else + { + L(FL("metacharacter after *: doing it the slow way")); + do + { + if (do_match(s, se, p, pe)) + return true; + s++; + } + while (s < se); + } + return false; + + case META_ALT_BRA: + { + string::const_iterator prest, psub, pnext; + string::const_iterator srest; + + prest = find_next_subpattern(p, pe, false); + psub = p; + // [ psub ... prest ) is the current bracket pair + // (including the *closing* braket, but not the opening braket) + do + { + pnext = find_next_subpattern(psub, pe, true); + // pnext points just after a comma or the closing braket + // [ psub ... pnext ) is one branch with trailing delimiter + srest = (prest == pe ? se : s); + for (; srest < se; srest++) + { + if (do_match(s, srest, psub, pnext - 1) + && do_match(srest, se, prest, pe)) + return true; + } + // try the empty target too + if (do_match(s, srest, psub, pnext - 1) + && do_match(srest, se, prest, pe)) + return true; + + psub = pnext; + } + while (pnext < prest); + return false; + } + } + if (s < se) + { + ++s; + } + } + return s == se; +} + +bool globish::matches(string const & target) const +{ + bool result; + + // The empty pattern matches nothing. + if (compiled_pattern.empty()) + result = false; + else + result = do_match (target.begin(), target.end(), + compiled_pattern.begin(), compiled_pattern.end()); + + L(FL("matching '%s' against '%s': %s") + % target % (*this)() % (result ? "matches" : "does not match")); + return result; +} + + +// Local Variables: +// mode: C++ +// fill-column: 76 +// c-file-style: "gnu" +// indent-tabs-mode: nil +// End: +// vim: et:sw=2:sts=2:ts=2:cino=>2s,{s,\:s,+s,t0,g0,^-2,e-2,n-2,p2s,(0,=s: