Skip to content

Commit

Permalink
cli: add jj operation show command
Browse files Browse the repository at this point in the history
  • Loading branch information
bnjmnt4n committed Jul 22, 2024
1 parent 2e3256f commit 58594af
Show file tree
Hide file tree
Showing 5 changed files with 530 additions and 0 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
* New command `jj operation diff` that can compare changes made between two
operations.

* New command `jj operation show` that can show the changes made in a single
operation.

### Fixed bugs

* `jj diff --git` no longer shows the contents of binary files.
Expand Down
4 changes: 4 additions & 0 deletions cli/src/commands/operation/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@ mod abandon;
mod diff;
mod log;
mod restore;
mod show;
pub mod undo;

use abandon::{cmd_op_abandon, OperationAbandonArgs};
use clap::Subcommand;
use diff::{cmd_op_diff, OperationDiffArgs};
use log::{cmd_op_log, OperationLogArgs};
use restore::{cmd_op_restore, OperationRestoreArgs};
use show::{cmd_op_show, OperationShowArgs};
use undo::{cmd_op_undo, OperationUndoArgs};

use crate::cli_util::CommandHelper;
Expand All @@ -39,6 +41,7 @@ pub enum OperationCommand {
Diff(OperationDiffArgs),
Log(OperationLogArgs),
Restore(OperationRestoreArgs),
Show(OperationShowArgs),
Undo(OperationUndoArgs),
}

Expand All @@ -52,6 +55,7 @@ pub fn cmd_operation(
OperationCommand::Diff(args) => cmd_op_diff(ui, command, args),
OperationCommand::Log(args) => cmd_op_log(ui, command, args),
OperationCommand::Restore(args) => cmd_op_restore(ui, command, args),
OperationCommand::Show(args) => cmd_op_show(ui, command, args),
OperationCommand::Undo(args) => cmd_op_undo(ui, command, args),
}
}
Expand Down
96 changes: 96 additions & 0 deletions cli/src/commands/operation/show.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
// Copyright 2024 The Jujutsu Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

use itertools::Itertools;

use super::diff::show_op_diff;
use crate::cli_util::{CommandHelper, LogContentFormat};
use crate::command_error::{user_error, CommandError};
use crate::diff_util::DiffFormatArgs;
use crate::operation_templater::OperationTemplateLanguage;
use crate::ui::Ui;

/// Show changes to the repository in an operation
#[derive(clap::Args, Clone, Debug)]
pub struct OperationShowArgs {
/// Show repository changes in this operation, compared to its parent(s)
#[arg(visible_alias = "op", default_value = "@")]
operation: String,
/// Don't show the graph, show a flat list of modified changes
#[arg(long)]
no_graph: bool,
/// Show patch of modifications to changes
///
/// If the previous version has different parents, it will be temporarily
/// rebased to the parents of the new version, so the diff is not
/// contaminated by unrelated changes.
#[arg(long, short = 'p')]
patch: bool,
#[command(flatten)]
diff_format: DiffFormatArgs,
}

pub fn cmd_op_show(
ui: &mut Ui,
command: &CommandHelper,
args: &OperationShowArgs,
) -> Result<(), CommandError> {
let workspace_command = command.workspace_helper(ui)?;
let repo = workspace_command.repo();
let current_op_id = repo.operation().id();
let repo_loader = &repo.loader();
let op = workspace_command.resolve_single_op(&args.operation)?;
let parents: Vec<_> = op.parents().try_collect()?;
if parents.is_empty() {
return Err(user_error("Cannot show the root operation"));
}
let parent_op = repo_loader.merge_operations(command.settings(), parents, None)?;
let parent_repo = repo_loader.load_at(&parent_op)?;
let repo = repo_loader.load_at(&op)?;

let workspace_command = command.for_loaded_repo(ui, command.load_workspace()?, repo.clone())?;
let commit_summary_template = workspace_command.commit_summary_template();

let with_content_format = LogContentFormat::new(ui, command.settings())?;
let diff_renderer = workspace_command.diff_renderer_for_log(&args.diff_format, args.patch)?;

// TODO: Should we make this customizable via clap arg?
let template;
{
let language = OperationTemplateLanguage::new(
repo_loader.op_store().root_operation_id(),
Some(current_op_id),
command.operation_template_extensions(),
);
let text = command.settings().config().get_string("templates.op_log")?;
template = workspace_command
.parse_template(&language, &text, OperationTemplateLanguage::wrap_operation)?
.labeled("op_log");
}

ui.request_pager();
template.format(&op, ui.stdout_formatter().as_mut())?;

show_op_diff(
ui,
command,
repo.as_ref(),
&parent_repo,
&repo,
&commit_summary_template,
!args.no_graph,
&with_content_format,
diff_renderer,
)
}
35 changes: 35 additions & 0 deletions cli/tests/[email protected]
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ This document contains the help content for the `jj` command-line program.
* [`jj operation diff`↴](#jj-operation-diff)
* [`jj operation log`↴](#jj-operation-log)
* [`jj operation restore`↴](#jj-operation-restore)
* [`jj operation show`↴](#jj-operation-show)
* [`jj operation undo`↴](#jj-operation-undo)
* [`jj parallelize`↴](#jj-parallelize)
* [`jj prev`↴](#jj-prev)
Expand Down Expand Up @@ -1242,6 +1243,7 @@ For information about the operation log, see https://github.com/martinvonz/jj/bl
* `diff` — Compare changes to the repository between two operations
* `log` — Show the operation log
* `restore` — Create a new operation that restores the repo to an earlier state
* `show` — Show changes to the repository in an operation
* `undo` — Create a new operation that undoes an earlier operation
Expand Down Expand Up @@ -1341,6 +1343,39 @@ This restores the repo to the state at the specified operation, effectively undo
## `jj operation show`
Show changes to the repository in an operation
**Usage:** `jj operation show [OPTIONS] [OPERATION]`
###### **Arguments:**
* `<OPERATION>` — Show repository changes in this operation, compared to its parent(s)
Default value: `@`
###### **Options:**
* `--no-graph` — Don't show the graph, show a flat list of modified changes
* `-p`, `--patch` — Show patch of modifications to changes
If the previous version has different parents, it will be temporarily rebased to the parents of the new version, so the diff is not contaminated by unrelated changes.
* `-s`, `--summary` — For each path, show only whether it was modified, added, or deleted
* `--stat` — Show a histogram of the changes
* `--types` — For each path, show only its type before and after
The diff is shown as two letters. The first letter indicates the type before and the second letter indicates the type after. '-' indicates that the path was not present, 'F' represents a regular file, `L' represents a symlink, 'C' represents a conflict, and 'G' represents a Git submodule.
* `--name-only` — For each path, show only its path
Typically useful for shell commands like: `jj diff -r @- --name_only | xargs perl -pi -e's/OLD/NEW/g`
* `--git` — Show a Git-format diff
* `--color-words` — Show a word-level diff with changes indicated only by color
* `--tool <TOOL>` — Generate diff by external command
* `--context <CONTEXT>` — Number of lines of context to show
## `jj operation undo`
Create a new operation that undoes an earlier operation
Expand Down
Loading

0 comments on commit 58594af

Please sign in to comment.