Magit v2.1.0 Release Notes
==========================

Released 1 July 2015 by Jonas Bernoulli.

This release marks the end of a commit marathon that lasted for more
than 4700 commits.  It is the first major release in over two and a
half years.  The last major release was 1.2.0, which was released
under old leadership.  Version 1.4.0, which I released earlier this
year, for the most part consisted of changes that prepared for this
release (so you might want to read the respective release notes too).

This release comes with many new and exciting features, but the most
important change is the massive increase in consistency both in the
user interface and the internal abstractions.

Magit always provided a very intuitive staging interface, which is
vastly superior to `git add --interactive'.  This release extends this
to other apply variants.  Starting with this release, other areas have
also begun to be more than just incremental improvements over what Git
itself provides.  But this is still limited to certain features which
have gotten more attention than others (most prominently rebasing).

Interlude
---------

The code base is finally in a state that allows me to concentrate on
implementing my vision of what version control could be like.  But
this will only be possible if, unlike during the last two and a half
years, I am being paid for my work.

I intend to run a fund-raising campaign, but you can already donate
now (see http://magit.vc/donations.html).  I am also looking for
corporate sponsorship and/or employment.  One area where Magit
actually lags behind other Git clients is integration with Git hosting
platforms and code review tools.  I hope that these platforms have an
interest in being supported by the best Git client and are willing to
pay for it.

I am very interested in a job that would let me work on Magit *and* on
other projects, which would benefit from the skills I have acquired
integrating two complex systems and dealing with all the social and
technical challenges that arise when running a popular project.

Changes since v1.4.0
--------------------

 * A new manual has been added.  It's much more comprehensive than the
   old manual and instead of just documenting the various commands and
   options, it also explains concepts and plumbing functions, and
   comes with extensive indices for commands, functions, and options.

   Actually three new manuals were added; the packages `magit-popup'
   and `with-editor' are documented in separate manuals.

   The manuals are written in Org mode and then exported to Texinfo.

 * Performance is much better now.  In most cases this was achieved by
   delaying work until it is actually needed.  Most importantly diffs
   are only partially washed until being fully expanded.  Some
   features come in a fancy and in a fast variant; when that is the
   case, we now usually default to the fast variant.

 * Many options can now be set on a per-repository basis, and the
   manual describes how to do so.  (Actually this was always possible
   but, because it was undocumented, nobody did it.)  It's possible to
   define "repository classes", e.g. "huge repositories", and then add
   the respective repositories to that class.  This is very useful in
   order to turn off certain features only in repositories where they
   would have a negative impact on performance, without having to do
   it for each repository individually.

 * Many faces have been simplified.  Most importantly, section heading
   faces no longer set a background color (except for hunk headings)
   and instead just use the default background.  Refname faces no
   longer set the background color or the box property.

 * Many, probably the majority of, functions, variables, and faces
   have been renamed, which was necessary because there was very
   little consistency before.

   Most importantly, the names of commands and options now begin with
   a prefix that includes the name of the respective git sub-command.
   For example, the names of all commands and options related to
   diffing now begin with `magit-diff-'.

   Many plumbing functions and variables were also renamed.  In some
   cases, that also lead to shared prefixes, such as `magit-process-',
   `magit-mode-', `magit-git-', and `magit-insert-'.  But many
   plumbing functions and variables continue to use names whose only
   common part is the `magit-' prefix.

   Future renames will be performed at well defined times and obsolete
   function/variable definitions will be provided for backward
   compatibility.  No renames are planned at present.

 * The external libraries `git-commit-mode.el' and `git-rebase-mode.el'
   are no longer required and have to be uninstalled because they
   conflict with their successors `git-commit.el' and `git-rebase.el',
   which are now maintained inside the Magit repository instead of the
   Git-Modes repository.

   The library `git-commit.el' can be used without Magit, so it is
   distributed as a separate Elpa package.  However, `git-rebase.el'
   now depends on several Magit libraries and is therefore distributed
   as part of the `magit' package.

 * The library `magit-key-mode.el' was removed and replaced with
   `magit-popup.el'.  The new implementation is much more flexible and
   easier to use than the old one.  Major new features include setting
   default arguments directly inside the popup and macros for defining
   new popups and extending existing popups.

   This new library can also be used by packages that are not related
   to Magit and is therefore available as a separate Elpa package.

 * The library `with-editor.el' was added.  Its purpose is to use the
   emacsclient as $GIT_EDITOR when git is started as a subprocess and
   requires an editor.  This is used while committing and rebasing.
   This also works over Tramp, where a "sleeping editor" shell script
   is used to communicate over standard output instead of a socket
   like the emacsclient does.

   The `1.4.0' release already supported this, but this release splits
   this feature into a separate library.  And now that it is a separate
   library, it can also be used by packages that are not related to
   Magit.  `with-editor.el' is distributed as a separate Elpa package.

 * All libraries are now located in the new `lisp/' subdirectory.

 * The library `magit.el' has been split into many new libraries.
   The code base is now much better organized.  Together with the
   description of plumbing commands in the manual, this should make it
   much easier for contributors to get started.

 * The library `magit-wip.el' has been rewritten from scratch and no
   longer depends on the external and unmaintained shell script from
   https://github.com/bartman/git-wip.

 * There are now three different modes that commit to the
   work-in-progress refs before/after certain events, and in addition
   to the old working tree wip refs, these modes now also commit to
   index wip refs.  When these new modes are turned on, Git's
   protection of committed (but dangling) changes is effectively
   extended to uncommitted changes (which some exceptions).  These
   modes are not enabled by default due to performance concerns.

 * The library `magit-blame.el' has been rewritten from scratch.  The
   new implementation can blame recursively, jump to the next/previous
   chunk from the same commit, replace headings with separator lines,
   scroll the revision buffer for the chunk at point (like log buffers),
   and fine-tune the arguments for `git blame' using a popup.

 * The new library `magit-ediff.el' replaces the old Ediff support.
   The new implementation comes with a dwim command and a popup, and
   it relies less on high-level functions provided by VC and Ediff
   itself, because many of those turned out to be unsuitable.

 * The popular third-party library `dash.el' is now required.  This
   is the only mandatory external dependency now, except for Git and
   Emacs themselves, of course.

 * When using Ido inside Magit, users now have to install the
   third-party library `ido-completing-read+.el'.  This is necessary
   because the function `ido-completing-read', which is part of the
   built-in library `ido.el', is not a sufficient drop-in replacement
   for `completing-read'.

 * The new macro `magit-insert-section' replaces `magit-with-section'.
   The macros `magit-cmd-insert-section' and `magit-git-insert-section'
   were removed without a direct replacement.

 * The new functions `magit-insert' and `magit-put-face-property' take
   care of working around the fact that negative overlay priorities
   are not supported, i.e., that overlays always take precedence
   against text properties.  Previously this was done in various
   places, and not always correctly (e.g., in some cases overlays did
   not evaporate).

 * The section visibility and movement commands were rewritten from
   scratch.  All those commands now share the prefix `magit-section-'
   and edge cases are handled better.  New commands were added that
   allow cycling the visibility of sections and their children.  From
   a user perspective Magit's section handling is now quite similar to
   that of Org mode.

 * The macro `magit-section-action' was removed.  The related macro
   `magit-section-case' still exists and will continue to do so.  The
   action variant provided user-customizable hooks, but these hooks
   were rarely, if ever, used.  Instead of such action hooks, users who
   wish to extend Magit now have to use type-specific section keymaps.

 * Section highlighting was rewritten from scratch.  The new
   implementation uses hooks to allow washing certain section types
   differently than others - without obfuscating the simple cases.
   Washing diffs is much more complicated than washing all other
   sections, and that part has been factored out.  The washing of
   all other section types is now quite simple.

 * The appearance of the region now indicates whether it is valid as a
   selection.  As far as Magit is concerned, valid selections are hunk
   internal regions and regions that mark sibling sections of the same
   type.  When a region does not satisfy one of these, then it is
   displayed the sames as in other buffers and Magit cannot act on it.

 * The new option `magit-no-confirm' makes it easy to forgo having to
   confirm potentially dangerous actions.  Many of these actions are
   only dangerous for users who don't know how to undo them.  When the
   wip modes are turned on, many more previously fatal actions can be
   easily undone.  Adding `safe-with-wip' here makes it unnecessary to
   confirm these actions.

 * The new Refs buffer combines the features of the old Wazzup and
   Branch Manager buffers into one, more powerful and efficient
   synthesis.  For each reference, cherries can be shown by expanding
   the ref section, but unlike in the Wazzup buffer, the cherries are
   not calculated until the expansion happens, making it vastly more
   efficient.  Besides local and remote branches, the buffer now also
   lists tags, and users can add additional sections listing other
   refs, e.g., stashes.  The format of refs headers is now
   customizable.

 * File-visiting buffers are now reverted without using code from the
   built-in `autorevert.el` library.  The function we previously used
   was intended for internal use only and indeed, changes made there
   broke Magit in the past.

 * The new option `magit-revert-buffers' controls whether and how
   buffers visiting tracked files are reverted.  As before, such
   buffers are reverted by default.  But by default this is now done
   rather noisily to encourage users to read the doc-string and
   pick what is right for them.  It's now also possible to revert
   asynchronously and for the user to be asked every time there are
   buffers that could be reverted.  This option replaces
   `magit-auto-revert-mode`.

 * Many new section inserters are available.  Some are variations of
   default inserters; `magit-insert-unpulled-cherries', for example, is
   like `magit-insert-unpulled-commits' but prefixes each commit with
   "+" or "-" to indicate its "cherry state". Other inserters are
   completely new (e.g., `magit-insert-unpulled-module-commits').

 * The header sections in status buffers can now be customized using
   the new `magit-status-headers-hook'.  This is an additional section
   insertion hook; separating it from `magit-status-sections-hook'
   gives users complete control over what information is displayed in
   the headers, while still making the first header the parent section
   of all the other header lines.

 * Many commands that previously could only act on the section at
   point can now act on all sections selected by a region, which can
   span sibling sections of the same type.

 * Many commands now more intelligently dwim based on the section at
   point.

 * Where it makes sense, completion and confirmation have been merged
   into a single user action.  Many commands that previously allowed
   carrying out or aborting some action now also allow the user to act
   on something different from the default choice.  Where one
   previously had to confirm with `yes RET', one now confirms with just
   `RET' (to accept the default choice, which previously was the only
   choice).

 * The distinction between the various "apply variants" has been
   clearly worked out, and they now all provide the same feature set.
   The variants are: stage, unstage, discard, reverse, and "regular
   apply".  In all cases, it is possible to act on a file or hunk, or
   part of a hunk.  When acting on the hunk level, all variants are
   implemented on top of `git apply', thus the name "apply variants".

   Un-/staging has always been one of Magit's most beloved features,
   and this release takes it to the next level by making the other
   apply variants just as consistent, powerful, and intuitive to use.

   All apply variants are context aware, meaning that, for example, the
   stage variant knows that an already staged change cannot be staged.
   That leads to better error messages.

 * The committing prefix now features additional variants.  It was
   already possible to quickly create a fixup or squash commit; the
   new variants do that and then also instantly perform a rebase to
   actually combine these commits with their intended target commits.

 * Rebase sequences are now initiated from the new rebasing prefix.
   Several rebasing variants exist, of course including basic
   "rebase onto something" and interactive rebase.  Other variants
   automatically detect and combine squash and fixup commits with
   their intended targets.  Others let the user edit or reword a
   single commit, without having to go through the steps that are
   irrelevant in these cases.

 * When a rebase sequence stops at a commit, then the rebasing prefix
   instead features suffix commands for continuing, editing, or
   aborting the sequence; or skipping the current commit.

 * When a rebase sequence stops, the status buffer displays a list of
   the already applied and yet-to-be applied commits.  These commits
   can be acted on like those in logs.

 * Cherry-picking, reverting, and applying patches using `git am' are
   treated the same way as rebasing.  A prefix command features
   several variants to initiate the sequence.  When a sequence is in
   progress, then the same prefix instead features suffix commands for
   continuing or aborting the sequence, and the status buffer lists
   the relevant commits.

 * The magit-specific "rewriting" feature has been removed because it
   was a hybrid of "rebasing" and "cherry-picking" and vastly
   inferior to both of them.

 * The merging prefix features several new convenient merge variants.

 * Merges can now be previewed before actually carrying them out.

 * When a merge results in conflicts then the commits being merged are
   listed in the status buffer, making it easier to review conflicting
   changes in the context they were created.

 * Its now possible to discard one side of a conflict directly from
   the hunk containing the conflict, using the regular discard key
   `k'.  It's also possible to restore a conflict.

 * When using an existing branch as the starting-point of a new
   branch, it is now automatically configured as the upstream branch.

 * The branching prefix now features suffix commands for un-/setting
   the upstream branch.  Previously this was coupled with pushing in
   a truly obscure way.

 * Branch descriptions can now be displayed in the refs or status
   buffer, and the description can be edited using a suffix command
   from the branching prefix.

 * The URL of a remote can now be changed from the remoting prefix.

 * A new pulling prefix command was added, which features several new
   pulling variants.  Previously only one pulling command existed and
   it had to be controlled using prefix arguments, which was very
   cumbersome.

 * A new pushing prefix command was added, which features several new
   pushing variants.  Previously only one pushing command existed and
   it had to be controlled using prefix arguments, which was very
   cumbersome.

 * The various tagging commands are now suffix commands of the new
   tagging prefix command.

 * It is now possible to stash, or create a snapshot from, just the
   staged or the unstaged changes, instead of both.  Suffix commands
   for branching, listing, and showing stashes were added to the
   stashing prefix

 * When creating stashes the new implementation in `magit-wip.el' is
   used instead of `git stash'.  This allows the user to create
   snapshot stashes without touching any files in the working tree.

 * The submodule prefix now features new suffix commands for adding,
   setting up, and fetching modules.

 * Submodules with unmerged commits can now be displayed in the status
   buffer.  Sections representing submodules can be expanded to show
   their unpulled commits.  These commits can be acted on like commits
   belonging to the super-project.

 * Support for displaying diffs inside the log buffer instead of in a
   separate diff buffer has been removed.  It might come back one day,
   but the old implementation had just fallen behind regular one-line
   log too much.

 * The logging prefix features many new infix arguments and suffix
   commands, which can now be combined in more flexible ways than
   before.

 * Many commands that previously read a single commit, branch, or
   file in the minibuffer, can now read multiple, comma-separated items
   from the user, while providing completion candidates for all of
   them.  Likewise, when selecting a range, completion is available
   for the second commit too.

 * All of Git's reset variants are now exposed as individual commands,
   but not all of them have a key binding by default.

This was just the tip of the iceberg.

Authors
-------

  2187  Jonas Bernoulli
    28  Sebastian Wiesner
    25  Kyle Meyer
    19  Noam Postavsky
    17  Pieter Praet
    12  Rémi Vanicat
     9  Florian Ragwitz
     5  Philippe Vaucher
     5  Ramkumar Ramachandra
     4  Cornelius Mika
     4  Kan-Ru Chen
     4  Syohei Yoshida
     3  Alex Dunn
     3  Alex Kost
     3  Nicolas Richard
     2  Eric Schulte
     2  Ingo Lohmar
     2  Mitchel Humpherys
     2  Peter Eisentraut
     2  Ryan C. Thompson
     1  Adeodato Simó
     1  Andrew Schwartzmeyer
     1  Andy Sawyer
     1  Bradley Wright
     1  Guillaume Martres
     1  John Mastro
     1  John Wiegley
     1  Julien Danjou
     1  Lingchao Xin
     1  Mark Oteiza
     1  Michael Fogleman
     1  Michael Griffiths
     1  Michal Sojka
     1  Natalie Weizenbaum
     1  Oleh Krehel
     1  Peter Vasil
     1  Rüdiger Sonderfeld
     1  Steven E. Harris
     1  Teemu Likonen
     1  Thomas A Caswell
     1  Tim Perkins
     1  Tim Wraight
     1  Wei Huang
     1  Xavier Noria
