= Inline Edit

This page explains the workflow for creating and amending changes in the
browser.


[[create-change]]
== Creating a New Change

A new change can be created directly in the browser, meaning it is not necessary
to clone the whole repository to make trivial changes.

The new change is created as a draft change, unless
link:config-gerrit.html#change.allowDrafts[change.allowDrafts] is set to false,
in which case the change is created as a normal new change.

There are two different ways to create a new change:

By clicking on the 'Create Change' button in the project screen:

[[create-change-from-project-info-screen]]

image::images/inline-edit-create-change-project-screen.png[width=800, link="images/inline-edit-create-change-project-screen.png"]

The user can select the branch on which the new change should be created:

image::images/inline-edit-create-change-project-screen-dialog.png[width=800, link="images/inline-edit-create-change-project-screen-dialog.png"]

By clicking the 'Follow-Up' button on the change screen, to create a new change
based on the selected change.

[[create-change-from-change-screen]]

image::images/inline-edit-create-follow-up-change.png[width=800, link="images/inline-edit-create-follow-up-change.png"]

[[editing-change]]
== Editing Changes

To switch to edit mode, press the 'Edit' button at the top of the file list:

[[switch-to-edit-mode]]
image::images/inline-edit-enter-edit-mode-from-file-list.png[width=800, link="images/inline-edit-enter-edit-mode-from-file-list.png"]

While in edit mode, it is possible to add new files to the change by clicking
the 'Add...' button at the top of the file list.

File changes can be reverted or files can be removed from the change or
deleted files can be restored, by clicking the icons to the left of the file
name.

To switch from edit mode back to review mode, click the 'Done Editing' button.

image::images/inline-edit-file-list-in-edit-mode.png[width=800, link="images/inline-edit-file-list-in-edit-mode.png"]

[[open-full-screen-editor]]
While in edit mode, clicking on a file name in the file list opens a full
screen editor for that file.

To save edits, click the 'Save' button or press `CTRL-S`.  To return to the
change screen, click the 'Close' button.

Note that when editing the commit message, trailing blank lines will be stripped.

image::images/inline-edit-full-screen-editor.png[width=800, link="images/inline-edit-full-screen-editor.png"]

If there are unsaved edits when the 'Close' button is pressed, a dialog will
pop up asking to confirm the edits.

image::images/inline-edit-confirm-unsaved-edits.png[width=800, link="images/inline-edit-confirm-unsaved-edits.png"]

To discard the unsaved edits and return to the change screen, click the 'OK'
button. To continue editing, click 'Cancel'.

[[switch-to-edit-mode-from-side-by-side]]

While in review mode, it is possible to switch directly to edit mode and into an
editor for a file under review by clicking on the edit icon in the patch set list
on the side-by-side diff view.

image::images/inline-edit-enter-edit-mode-from-diff.png[width=800, link="images/inline-edit-enter-edit-mode-from-diff.png"]

[[reviewing-changes-made-in-change-edit]]
== Reviewing Change Edits

Change edits are reviewed in the same way as regular patch sets, using the
side-by-side diff screen. Change edits are shown as 'edit' in the patch list
on the diff screen:

image::images/inline-edit-edit-in-diff-screen-patch-list.png[width=800, link="images/inline-edit-edit-in-diff-screen-patch-list.png"]

and on the change screen:

image::images/inline-edit-edit-in-patch-list.png[width=800, link="images/inline-edit-edit-in-patch-list.png"]

Note that patch sets may exist that were created after the change edit was created.

For example this sequence:

`1 2 3 4 5 6 7 8 9 edit 10`

means that the change edit was created on top of patch set number 9 and a regular
patch set was uploaded later.

[[change-edit-actions]]
== Change Edit Actions

Change edits can be deleted, published and rebased, and a patch set that
represents a change edit can be downloaded like a regular patch set.

[[delete-change-edit]]

There is a special ref for a change edit. When the change edit is deleted, this
ref is deleted as well. To delete a change edit click on the "Delete Edit"
button.

[[publish-change-edit]]

When a change edit is based on the current patch set, it can be published. By
publishing a change edit it is promoted to a regular patch set. The special ref
that represents the change edit is deleted on publish. To publish a change edit
click on the "Publish Edit" button. This button is only shown when the change
edit is based on the current patch set. Otherwise the change edit must first be
rebased onto the current patch set.

[[rebase-change-edit]]

Only change edits that are based on the current patch set can be published. If
in the meantime a new patch set was uploaded, the change edit must be rebased on
top of the current patch set before it can be published. Rebasing a change
edit is done by clicking on the "Rebase Edit" button. If the rebase results in
conflicts, these conflicts cannot be resolved in the browser. In this case the
change edit must be downloaded (see below) and the conflicts must be resolved in
the local environment. The commit that contains the conflict resolution can then
be uploaded by setting `edit` as option on the target ref:

----
  $ git push host HEAD:refs/for/master%edit
----

[[download-change-edit-patch]]

Like regular patch sets, change edits can be downloaded by the download
commands (e.g. provided by the `download-commands` plugin). To download a
change edit, select the desired scheme from the "Download" dropdown and copy the
command to your terminal. Note: only change edit owners and users that were
granted the link:access-control.html#capability_accessDatabase[accessDatabase]
global capability are able to access change edit refs.

[[search-for-change-edits]]

To search change edits from the UI the link:user-search.html#has[has:edit]
predicate can be used.

Alternatively change edits can be accessed through "My => Edits" dashboard.

[[not-implemented-features]]
== Not Implemented Features

* Support default configuration options for inline editor that an
administrator has set in `refs/users/default:preferences.config` file.

* Allow to rename files that are already contained in the change (from the file table).
The same rename file dialog can be used with preselected and disabled original file
name.

* Changed files in change edit should be marked as changed in file table in edit mode.
One option is to use dirty icon or "*" char in front of changed files, another option
is to use different hyperlink color for changed files (red?), to avoid adding yet another
column to the file table

* Add navigation icons in header area of edit screen. When dozen files need to be changed
in context of change edit, this is not the best workflow to open one file in edit screen,
change it, save it, close edit screen and select next file from the file table to edit.
"<-" | "->" icons in header of edit screen could be used to navigate to the next file to
change from the file table. This would behave like the navigation icons in side by side
with the following logic on click:

** "save-when-file-was-changed" or
** "close-when-no-changes"

* Implement conflict resolution during rebase of change edit using inline edit
feature by creating new edit on top of current patch set with auto merge content

* Similarly, reuse inline edit feature for conflict resolution during rebase of regular
patch sets

GERRIT
------
Part of link:index.html[Gerrit Code Review]

SEARCHBOX
---------
