Skip to content

Commit 72a7732

Browse files
authored
Merge pull request #33 from Tyil/command-clean
Command clean
2 parents 70cb68d + 12aaffb commit 72a7732

File tree

6 files changed

+219
-1
lines changed

6 files changed

+219
-1
lines changed

META6.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@
2121
"perl": "6.c",
2222
"provides": {
2323
"App::Cpan6": "lib/App/Cpan6.pm6",
24+
"App::Cpan6::Clean": "lib/App/Cpan6/Clean.pm6",
2425
"App::Cpan6::Commands::Bootstrap::Config": "lib/App/Cpan6/Commands/Bootstrap/Config.pm6",
2526
"App::Cpan6::Commands::Bootstrap::Man": "lib/App/Cpan6/Commands/Bootstrap/Man.pm6",
2627
"App::Cpan6::Commands::Bump": "lib/App/Cpan6/Commands/Bump.pm6",
28+
"App::Cpan6::Commands::Clean": "lib/App/Cpan6/Commands/Clean.pm6",
2729
"App::Cpan6::Commands::Depend": "lib/App/Cpan6/Commands/Depend.pm6",
2830
"App::Cpan6::Commands::Dist": "lib/App/Cpan6/Commands/Dist.pm6",
2931
"App::Cpan6::Commands::Help": "lib/App/Cpan6/Commands/Help.pm6",
@@ -67,4 +69,4 @@
6769
"ecosystems"
6870
],
6971
"version": "0.17.3"
70-
}
72+
}

bin/cpan6

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use v6.c;
55
use App::Cpan6::Commands::Bootstrap::Config;
66
use App::Cpan6::Commands::Bootstrap::Man;
77
use App::Cpan6::Commands::Bump;
8+
use App::Cpan6::Commands::Clean;
89
use App::Cpan6::Commands::Depend;
910
use App::Cpan6::Commands::Dist;
1011
use App::Cpan6::Commands::Help;

lib/App/Cpan6/Clean.pm6

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
#! /usr/bin/env false
2+
3+
use v6.c;
4+
5+
use App::Cpan6::Meta;
6+
use App::Cpan6::Input;
7+
8+
unit module App::Cpan6::Clean;
9+
10+
sub clean-files (
11+
Str:D :$path,
12+
Bool:D :$force = False,
13+
Bool:D :$verbose = False,
14+
--> Bool
15+
) is export {
16+
my %meta = get-meta;
17+
18+
# Clean up bin and lib directories
19+
for < bin lib > -> $directory {
20+
for find-files($directory) -> $file {
21+
next if ~$file ~~ /\.precomp/;
22+
next if %meta<provides>.values ~$file;
23+
24+
say "Removing $file" if $verbose;
25+
unlink($file) if $force || confirm("Really delete $file?");
26+
}
27+
}
28+
29+
# Clean up resources
30+
for find-files("resources") -> $file {
31+
next if %meta<resources> $file.subst("resources/", "");
32+
33+
say "Removing $file" if $verbose;
34+
unlink($file) if $force || confirm("Really delete $file?");
35+
}
36+
}
37+
38+
sub clean-meta (
39+
Str:D :$path = ".",
40+
Bool:D :$force = False,
41+
Bool:D :$verbose = False,
42+
--> Bool
43+
) is export {
44+
my %meta = get-meta($path);
45+
my %provides;
46+
my @resources;
47+
48+
# Clean up provides
49+
for %meta<provides>.kv -> $key, $value {
50+
if ($value.IO.e) {
51+
%provides{$key} = $value;
52+
53+
next;
54+
}
55+
56+
say "Removing provides.$key ($value)" if $verbose;
57+
}
58+
59+
# Clean up resources
60+
for %meta<resources>.values -> $value {
61+
if ("resources/$value".IO.e) {
62+
@resources.push: $value;
63+
64+
next
65+
}
66+
67+
say "Removing resources.$value" if $verbose;
68+
}
69+
70+
return False unless $force || confirm("Save cleaned META6.json?");
71+
72+
%meta<provides> = %provides;
73+
%meta<resources> = @resources;
74+
75+
put-meta(:%meta, :$path);
76+
}
77+
78+
multi sub find-files (
79+
Str:D $path
80+
--> List
81+
) is export {
82+
find-files($path.IO)
83+
}
84+
85+
multi sub find-files (
86+
IO::Path:D $path
87+
--> List
88+
) is export {
89+
my @files;
90+
91+
for $path.dir -> $object {
92+
if ($object.IO.d) {
93+
@files.append: find-files($object);
94+
95+
next;
96+
}
97+
98+
@files.append: $object;
99+
}
100+
101+
@files;
102+
}
103+
104+
# vim: ft=perl6 noet

lib/App/Cpan6/Commands/Clean.pm6

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#! /usr/bin/env false
2+
3+
use v6.c;
4+
5+
use App::Cpan6::Clean;
6+
7+
unit module App::Cpan6::Commands::Clean;
8+
9+
multi sub MAIN(
10+
"clean",
11+
Str:D $path = ".",
12+
Bool:D :$no-meta = False,
13+
Bool:D :$no-files = False,
14+
Bool:D :$force = False,
15+
Bool:D :$verbose = False,
16+
) is export {
17+
# Clean up the META6.json
18+
clean-meta(:$path, :$force, :$verbose) unless $no-meta;
19+
20+
# Clean up unreferenced files
21+
clean-files(:$path, :$force, :$verbose) unless $no-files;
22+
23+
True;
24+
}
25+
26+
# vim: ft=perl6 noet

resources/man/cpan6.1.adoc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ Bumps the module's patch, minor or major version. If no bump type is supplied,
3131
it will be prompted. If a `.git` repository is found, a commit and a tag will
3232
be created as well.
3333

34+
=== [ --no-files ] [ --no-meta ] clean < path >
35+
Clean up files not referenced in the `META6.json`, and remove entries from
36+
`META6.json` which have no corresponding file. The `--no-files` flag will not
37+
remove files without a corresponding entry in the `META6.json`, while the
38+
`--no-meta` won't touch your `META6.json`.
39+
3440
=== [ --no-install ] depend < modules ... >
3541
Add a dependency to one or more modules. Will attempt to install the module
3642
locally as well, unless `--no-install` is supplied.

t/command-clean.t

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#! /usr/bin/env perl6
2+
3+
use v6.c;
4+
5+
use App::Cpan6::Commands::Clean;
6+
use App::Cpan6::Commands::New;
7+
use App::Cpan6::Meta;
8+
use File::Temp;
9+
use Test;
10+
11+
multi sub MAIN { 0 }
12+
13+
# Disable git
14+
%*ENV<CPAN6_EXTERNAL_GIT> = False;
15+
16+
my $root = tempdir;
17+
18+
chdir $root;
19+
20+
plan 4;
21+
22+
ok MAIN(
23+
"new",
24+
name => "Local::Test::Clean",
25+
author => "Patrick Spek",
26+
email => "p.spek@tyil.work",
27+
perl => "c",
28+
description => "Nondescript",
29+
license => "GPL-3.0",
30+
no-user-config => True,
31+
), "cpan6 new Local::Test::Clean";
32+
33+
# Create a non-clean META6.json
34+
my %meta = get-meta;
35+
%meta<provides><Local::Test::Clean::Orphan> = "lib/non-existant.pm6";
36+
37+
subtest "cpan6 clean", {
38+
plan 3;
39+
40+
# Setup
41+
mkdir "resources";
42+
spurt "resources/alpha", "";
43+
put-meta(:%meta);
44+
45+
# Test
46+
ok MAIN("clean", :force);
47+
nok "resources/alpha".IO.e;
48+
nok get-meta()<provides><Local::Test::Clean::Orphan>:exists;
49+
}
50+
51+
subtest "cpan6 --no-files clean", {
52+
plan 3;
53+
54+
# Setup
55+
mkdir "resources";
56+
spurt "resources/beta", "";
57+
put-meta(:%meta);
58+
59+
# Test
60+
ok MAIN("clean", :force, :no-files);
61+
ok "resources/beta".IO.e;
62+
nok get-meta()<provides><Local::Test::Clean::Orphan>:exists;
63+
}
64+
65+
subtest "cpan6 --no-meta clean", {
66+
plan 3;
67+
68+
# Setup
69+
mkdir "resources";
70+
spurt "resources/gamma", "";
71+
put-meta(:%meta);
72+
73+
# Test
74+
ok MAIN("clean", :force, :no-meta);
75+
nok "resources/gamma".IO.e;
76+
ok get-meta()<provides><Local::Test::Clean::Orphan>:exists;
77+
}
78+
79+
# vim: ft=perl6 noet

0 commit comments

Comments
 (0)