Skip to content

Commit cef2bbc

Browse files
gustavoavenafacebook-github-bot
authored andcommitted
Migrate megarepo tool gradual-delete command to newadmin
Summary: ## This stack Migrate all commands from megarepo tool CLI to mononoke admin `megarepo` subcommand, so they use mononoke_app + clap 4, instad of old cmdlib + clap-2. I'll try to do one diff per command. ## This diff Migrate the `gradual-delete` command. Differential Revision: D73503913 fbshipit-source-id: 0d3f9decb0cf0e073d56c809885b5bb173f093f8
1 parent c0e32a3 commit cef2bbc

File tree

6 files changed

+131
-100
lines changed

6 files changed

+131
-100
lines changed

eden/mononoke/commit_rewriting/megarepo/tool/cli.rs

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ pub const DRY_RUN: &str = "dry-run";
3939
pub const EVEN_CHUNK_SIZE: &str = "even-chunk-size";
4040
pub const GRADUAL_MERGE_PROGRESS: &str = "gradual-merge-progress";
4141
pub const GRADUAL_MERGE: &str = "gradual-merge";
42-
pub const GRADUAL_DELETE: &str = "gradual-delete";
4342
pub const HEAD_BOOKMARK: &str = "head-bookmark";
4443
pub const HISTORY_FIXUP_DELETE: &str = "history-fixup-deletes";
4544
pub const INPUT_FILE: &str = "input-file";
@@ -52,7 +51,6 @@ pub const MARK_PUBLIC: &str = "mark-public";
5251
pub const OVERWRITE: &str = "overwrite";
5352
pub const PARENTS: &str = "parents";
5453
pub const PATH_REGEX: &str = "path-regex";
55-
pub const PATH: &str = "path";
5654
pub const PATH_PREFIX: &str = "path-prefix";
5755
pub const PATHS_FILE: &str = "paths-file";
5856
pub const PRE_DELETION_COMMIT: &str = "pre-deletion-commit";
@@ -210,33 +208,6 @@ pub fn setup_app<'a, 'b>() -> MononokeClapApp<'a, 'b> {
210208
.multiple(true),
211209
);
212210

213-
// PLease don't move `add_light_resulting_commit_args` to be applied
214-
// after `PATH` arg is added, as in that case `PATH` won't be the last
215-
// positional argument
216-
let gradual_delete_subcommand =
217-
add_light_resulting_commit_args(SubCommand::with_name(GRADUAL_DELETE))
218-
.about("create a set of delete commits for given paths")
219-
.arg(
220-
Arg::with_name(COMMIT_HASH)
221-
.help("commit from which to start deletion")
222-
.takes_value(true)
223-
.required(true),
224-
)
225-
.arg(
226-
Arg::with_name(EVEN_CHUNK_SIZE)
227-
.help("chunk size for even chunking")
228-
.long(EVEN_CHUNK_SIZE)
229-
.takes_value(true)
230-
.required(true),
231-
)
232-
.arg(
233-
Arg::with_name(PATH)
234-
.help("paths to delete")
235-
.takes_value(true)
236-
.required(true)
237-
.multiple(true),
238-
);
239-
240211
let gradual_merge_subcommand = SubCommand::with_name(GRADUAL_MERGE)
241212
.about("Gradually merge a list of deletion commits")
242213
.arg(
@@ -529,7 +500,6 @@ pub fn setup_app<'a, 'b>() -> MononokeClapApp<'a, 'b> {
529500
.subcommand(history_fixup_delete_subcommand)
530501
.subcommand(add_light_resulting_commit_args(gradual_merge_subcommand))
531502
.subcommand(gradual_merge_progress_subcommand)
532-
.subcommand(gradual_delete_subcommand)
533503
.subcommand(manual_commit_sync_subcommand)
534504
.subcommand(add_light_resulting_commit_args(
535505
catchup_delete_head_subcommand,

eden/mononoke/commit_rewriting/megarepo/tool/main.rs

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,11 @@ use live_commit_sync_config::LiveCommitSyncConfig;
5252
use manifest::Entry;
5353
use manifest::ManifestOps;
5454
use manifest::PathOrPrefix;
55-
use megarepolib::chunking::Chunker;
5655
use megarepolib::chunking::even_chunker_with_max_size;
5756
use megarepolib::commit_sync_config_utils::diff_small_repo_commit_sync_configs;
5857
use megarepolib::common::create_and_save_bonsai;
59-
use megarepolib::common::delete_files_in_chunks;
6058
use megarepolib::history_fixup_delete::HistoryFixupDeletes;
6159
use megarepolib::history_fixup_delete::create_history_fixup_deletes;
62-
use megarepolib::working_copy::get_working_copy_paths_by_prefixes;
6360
use metaconfig_types::CommitSyncConfigVersion;
6461
use metaconfig_types::MetadataDatabaseConfig;
6562
use metaconfig_types::RepoConfig;
@@ -112,7 +109,6 @@ use crate::cli::DELETION_CHUNK_SIZE;
112109
use crate::cli::DIFF_MAPPING_VERSIONS;
113110
use crate::cli::DRY_RUN;
114111
use crate::cli::EVEN_CHUNK_SIZE;
115-
use crate::cli::GRADUAL_DELETE;
116112
use crate::cli::GRADUAL_MERGE;
117113
use crate::cli::GRADUAL_MERGE_PROGRESS;
118114
use crate::cli::HEAD_BOOKMARK;
@@ -125,7 +121,6 @@ use crate::cli::MAPPING_VERSION_NAME;
125121
use crate::cli::MARK_NOT_SYNCED_COMMAND;
126122
use crate::cli::OVERWRITE;
127123
use crate::cli::PARENTS;
128-
use crate::cli::PATH;
129124
use crate::cli::PATH_PREFIX;
130125
use crate::cli::PATH_REGEX;
131126
use crate::cli::PATHS_FILE;
@@ -247,66 +242,6 @@ async fn run_history_fixup_delete<'a>(
247242
Ok(())
248243
}
249244

250-
async fn run_gradual_delete<'a>(
251-
ctx: &CoreContext,
252-
matches: &MononokeMatches<'a>,
253-
sub_m: &ArgMatches<'a>,
254-
) -> Result<(), Error> {
255-
let repo: Repo =
256-
args::not_shardmanager_compatible::open_repo(ctx.fb, &ctx.logger().clone(), matches)
257-
.await?;
258-
259-
let delete_cs_args_factory = get_delete_commits_cs_args_factory(sub_m)?;
260-
261-
let chunker: Chunker<NonRootMPath> = {
262-
let even_chunk_size: usize = sub_m
263-
.value_of(EVEN_CHUNK_SIZE)
264-
.ok_or_else(|| format_err!("{} is required", EVEN_CHUNK_SIZE))?
265-
.parse::<usize>()?;
266-
even_chunker_with_max_size(even_chunk_size)?
267-
};
268-
269-
let parent_bcs_id = {
270-
let hash = sub_m.value_of(COMMIT_HASH).unwrap().to_owned();
271-
helpers::csid_resolve(ctx, &repo, hash).await?
272-
};
273-
274-
let path_prefixes: Vec<_> = sub_m
275-
.values_of(PATH)
276-
.unwrap()
277-
.map(NonRootMPath::new)
278-
.collect::<Result<Vec<_>, Error>>()?;
279-
info!(
280-
ctx.logger(),
281-
"Gathering working copy files under {:?}", path_prefixes
282-
);
283-
let paths =
284-
get_working_copy_paths_by_prefixes(ctx, &repo, parent_bcs_id, path_prefixes).await?;
285-
info!(ctx.logger(), "{} paths to be deleted", paths.len());
286-
287-
info!(ctx.logger(), "Starting deletion");
288-
let delete_commits = delete_files_in_chunks(
289-
ctx,
290-
&repo,
291-
parent_bcs_id,
292-
paths,
293-
&chunker,
294-
&delete_cs_args_factory,
295-
false, /* skip_last_chunk */
296-
)
297-
.await?;
298-
info!(ctx.logger(), "Deletion finished");
299-
info!(
300-
ctx.logger(),
301-
"Listing commits in an ancestor-descendant order"
302-
);
303-
for delete_commit in delete_commits {
304-
println!("{}", delete_commit);
305-
}
306-
307-
Ok(())
308-
}
309-
310245
async fn run_gradual_merge<'a>(
311246
ctx: &CoreContext,
312247
matches: &MononokeMatches<'a>,
@@ -1046,7 +981,6 @@ fn main(fb: FacebookInit) -> Result<()> {
1046981
(CATCHUP_VALIDATE_COMMAND, Some(sub_m)) => {
1047982
run_catchup_validate(ctx, &matches, sub_m).await
1048983
}
1049-
(GRADUAL_DELETE, Some(sub_m)) => run_gradual_delete(ctx, &matches, sub_m).await,
1050984
(GRADUAL_MERGE, Some(sub_m)) => run_gradual_merge(ctx, &matches, sub_m).await,
1051985
(GRADUAL_MERGE_PROGRESS, Some(sub_m)) => {
1052986
run_gradual_merge_progress(ctx, &matches, sub_m).await

eden/mononoke/tests/integration/cross_repo/library-git-submodules-repos-setup.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,10 @@ function merge_repo_a_to_large_repo {
151151
COMMIT_DATE="1985-09-04T00:00:00.00Z"
152152

153153
print_section "Creating deletion commits"
154-
REPOID="$LARGE_REPO_ID" with_stripped_logs megarepo_tool gradual-delete test_user \
155-
"deletion commits for merge into large repo" \
156-
"$IMPORTED_HEAD" "$SMALL_REPO_FOLDER" --even-chunk-size 2 \
157-
--commit-date-rfc3339 "$COMMIT_DATE" 2>&1 | tee "$TESTTMP/gradual_delete.out"
154+
with_stripped_logs mononoke_admin megarepo gradual-delete \
155+
--repo-id "$LARGE_REPO_ID" -a test_user -m "deletion commits for merge into large repo" \
156+
-i "$IMPORTED_HEAD" --even-chunk-size 2 --commit-date-rfc3339 "$COMMIT_DATE" \
157+
"$SMALL_REPO_FOLDER" 2>&1 | tee "$TESTTMP/gradual_delete.out"
158158

159159
LAST_DELETION_COMMIT=$(tail -n1 "$TESTTMP/gradual_delete.out")
160160
printf "\nLAST_DELETION_COMMIT: %s\n\n" "$LAST_DELETION_COMMIT"

eden/mononoke/tests/integration/megarepo/test-megarepo-tool.t

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,41 @@ test pre-merge deletes functionality
170170
8807f350542a43aa815abc0c250c4a79ba35fd5bb68594e3ce6555e6630d81c2
171171
090a140adb3da3f4a629014cd9625055d8bd992a967ad7fc7e4e4d74892c4b71
172172

173+
test gradual-delete functionality
174+
$ LAST_DELETION_BONSAI=$(mononoke_admin megarepo gradual-delete --repo-id 0 \
175+
> --bookmark master_bookmark \
176+
> -a author -m "gradual deletion" \
177+
> --even-chunk-size 1 \
178+
> --commit-date-rfc3339 "$COMMIT_DATE" \
179+
> arvr fbcode 2>/dev/null | tail -1)
180+
$ echo $LAST_DELETION_BONSAI
181+
87e09c9ddd7190bf5b19f4003e7356779b8df5487ab5f7ecf794100301b9e64b
182+
$ LAST_DELETION_COMMIT=$(mononoke_admin convert -R repo -f bonsai -t hg --derive $LAST_DELETION_BONSAI)
183+
$ echo $LAST_DELETION_COMMIT
184+
e7ee4708d8e0cd96c843ef598c7ad94882e42096
185+
186+
$ cd $TESTTMP/repo-pull
187+
$ sl pull -q -r $LAST_DELETION_COMMIT
188+
$ sl log --stat -r "reverse($LAST_DELETION_COMMIT % master_bookmark)"
189+
commit: e7ee4708d8e0
190+
user: author
191+
date: Wed Sep 04 00:00:00 1985 +0000
192+
summary: [MEGAREPO DELETE] gradual deletion (1)
193+
194+
fbcode/fbcodfile_fbsource | 1 -
195+
1 files changed, 0 insertions(+), 1 deletions(-)
196+
197+
commit: cd9e15c2d8e0
198+
user: author
199+
date: Wed Sep 04 00:00:00 1985 +0000
200+
summary: [MEGAREPO DELETE] gradual deletion (0)
201+
202+
arvr/arvrfile_ovrsource | 1 -
203+
1 files changed, 0 insertions(+), 1 deletions(-)
204+
205+
$ sl files -r "$LAST_DELETION_COMMIT" arvr fbcode || echo "Directories have been deleted"
206+
Directories have been deleted
207+
173208
run mover
174209
$ mononoke_admin megarepo run-mover \
175210
> --source-repo-id 0 --target-repo-id 1 \

eden/mononoke/tools/admin/src/commands/megarepo.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
mod bonsai_merge;
99
pub mod check_prereqs;
1010
pub(crate) mod common;
11+
mod gradual_delete;
1112
mod merge;
1213
mod move_commit;
1314
mod pre_merge_delete;
@@ -22,6 +23,7 @@ use mononoke_app::MononokeApp;
2223

2324
use self::bonsai_merge::BonsaiMergeArgs;
2425
use self::check_prereqs::CheckPrereqsArgs;
26+
use self::gradual_delete::GradualDeleteArgs;
2527
use self::merge::MergeArgs;
2628
use self::move_commit::MoveArgs;
2729
use self::pre_merge_delete::PreMergeDeleteArgs;
@@ -44,6 +46,7 @@ enum MegarepoSubcommand {
4446
MoveCommit(MoveArgs),
4547
RunMover(RunMoverArgs),
4648
SyncDiamondMerge(SyncDiamondMergeArgs),
49+
GradualDelete(GradualDeleteArgs),
4750
PreMergeDelete(PreMergeDeleteArgs),
4851
BonsaiMerge(BonsaiMergeArgs),
4952
CheckPrereqs(CheckPrereqsArgs),
@@ -63,6 +66,7 @@ pub async fn run(app: MononokeApp, args: CommandArgs) -> Result<()> {
6366
MegarepoSubcommand::PreMergeDelete(args) => pre_merge_delete::run(&ctx, app, args).await?,
6467
MegarepoSubcommand::BonsaiMerge(args) => bonsai_merge::run(&ctx, app, args).await?,
6568
MegarepoSubcommand::CheckPrereqs(args) => check_prereqs::run(&ctx, app, args).await?,
69+
MegarepoSubcommand::GradualDelete(args) => gradual_delete::run(&ctx, app, args).await?,
6670
}
6771

6872
Ok(())
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This software may be used and distributed according to the terms of the
5+
* GNU General Public License version 2.
6+
*/
7+
8+
use anyhow::Result;
9+
use context::CoreContext;
10+
use megarepolib::chunking::even_chunker_with_max_size;
11+
use megarepolib::common::delete_files_in_chunks;
12+
use megarepolib::working_copy::get_working_copy_paths_by_prefixes;
13+
use mononoke_api::Repo;
14+
use mononoke_app::MononokeApp;
15+
use mononoke_app::args::ChangesetArgs;
16+
use mononoke_app::args::RepoArgs;
17+
use mononoke_types::NonRootMPath;
18+
use slog::info;
19+
20+
use super::common::LightResultingChangesetArgs;
21+
use crate::commands::megarepo::common::get_delete_commits_cs_args_factory;
22+
23+
#[derive(Debug, clap::Args)]
24+
pub struct GradualDeleteArgs {
25+
#[clap(flatten)]
26+
pub repo_args: RepoArgs,
27+
28+
/// Commit from which to start deletion
29+
#[clap(flatten)]
30+
pub commit: ChangesetArgs,
31+
32+
#[clap(flatten)]
33+
pub res_cs_args: LightResultingChangesetArgs,
34+
35+
/// Chunk size for even chunking
36+
#[clap(long)]
37+
pub even_chunk_size: usize,
38+
39+
/// Paths to delete
40+
#[clap(required = true)]
41+
pub paths: Vec<String>,
42+
}
43+
44+
pub async fn run(ctx: &CoreContext, app: MononokeApp, args: GradualDeleteArgs) -> Result<()> {
45+
let repo: Repo = app.open_repo(&args.repo_args).await?;
46+
47+
let delete_cs_args_factory = get_delete_commits_cs_args_factory(args.res_cs_args)?;
48+
let chunker = even_chunker_with_max_size(args.even_chunk_size)?;
49+
50+
let parent_bcs_id = args.commit.resolve_changeset(ctx, &repo).await?;
51+
52+
let path_prefixes = args
53+
.paths
54+
.into_iter()
55+
.map(NonRootMPath::new)
56+
.collect::<Result<Vec<_>>>()?;
57+
58+
info!(
59+
ctx.logger(),
60+
"Gathering working copy files under {:?}", path_prefixes
61+
);
62+
let paths =
63+
get_working_copy_paths_by_prefixes(ctx, &repo, parent_bcs_id, path_prefixes).await?;
64+
info!(ctx.logger(), "{} paths to be deleted", paths.len());
65+
66+
info!(ctx.logger(), "Starting deletion");
67+
let delete_commits = delete_files_in_chunks(
68+
ctx,
69+
&repo,
70+
parent_bcs_id,
71+
paths,
72+
&chunker,
73+
&delete_cs_args_factory,
74+
false, /* skip_last_chunk */
75+
)
76+
.await?;
77+
78+
info!(ctx.logger(), "Deletion finished");
79+
info!(
80+
ctx.logger(),
81+
"Listing commits in an ancestor-descendant order"
82+
);
83+
for delete_commit in delete_commits {
84+
println!("{}", delete_commit);
85+
}
86+
87+
Ok(())
88+
}

0 commit comments

Comments
 (0)