just playing with tangled
1// Copyright 2023 The Jujutsu Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use std::fmt::Debug;
16use std::io::Write as _;
17
18use jj_lib::object_id::ObjectId as _;
19use jj_lib::revset;
20use jj_lib::revset::RevsetDiagnostics;
21
22use crate::cli_util::CommandHelper;
23use crate::command_error::print_parse_diagnostics;
24use crate::command_error::CommandError;
25use crate::revset_util;
26use crate::ui::Ui;
27
28/// Evaluate revset to full commit IDs
29#[derive(clap::Args, Clone, Debug)]
30pub struct DebugRevsetArgs {
31 revision: String,
32}
33
34pub fn cmd_debug_revset(
35 ui: &mut Ui,
36 command: &CommandHelper,
37 args: &DebugRevsetArgs,
38) -> Result<(), CommandError> {
39 let workspace_command = command.workspace_helper(ui)?;
40 let workspace_ctx = workspace_command.env().revset_parse_context();
41 let repo = workspace_command.repo().as_ref();
42
43 let mut diagnostics = RevsetDiagnostics::new();
44 let expression = revset::parse(&mut diagnostics, &args.revision, &workspace_ctx)?;
45 print_parse_diagnostics(ui, "In revset expression", &diagnostics)?;
46 writeln!(ui.stdout(), "-- Parsed:")?;
47 writeln!(ui.stdout(), "{expression:#?}")?;
48 writeln!(ui.stdout())?;
49
50 let symbol_resolver = revset_util::default_symbol_resolver(
51 repo,
52 command.revset_extensions().symbol_resolvers(),
53 workspace_command.id_prefix_context(),
54 );
55 let expression = expression.resolve_user_expression(repo, &symbol_resolver)?;
56 writeln!(ui.stdout(), "-- Resolved:")?;
57 writeln!(ui.stdout(), "{expression:#?}")?;
58 writeln!(ui.stdout())?;
59
60 let expression = revset::optimize(expression);
61 writeln!(ui.stdout(), "-- Optimized:")?;
62 writeln!(ui.stdout(), "{expression:#?}")?;
63 writeln!(ui.stdout())?;
64
65 let backend_expression = expression.to_backend_expression(repo);
66 writeln!(ui.stdout(), "-- Backend:")?;
67 writeln!(ui.stdout(), "{backend_expression:#?}")?;
68 writeln!(ui.stdout())?;
69
70 let revset = expression.evaluate_unoptimized(repo)?;
71 writeln!(ui.stdout(), "-- Evaluated:")?;
72 writeln!(ui.stdout(), "{revset:#?}")?;
73 writeln!(ui.stdout())?;
74
75 writeln!(ui.stdout(), "-- Commit IDs:")?;
76 for commit_id in revset.iter() {
77 writeln!(ui.stdout(), "{}", commit_id?.hex())?;
78 }
79 Ok(())
80}