[thin_delta] Clean up duplicated code

This commit is contained in:
Ming-Hung Tsai 2020-10-20 15:18:06 +08:00
parent b42408ef41
commit 1d5b52b0dd
1 changed files with 31 additions and 74 deletions

View File

@ -22,47 +22,7 @@ using namespace thin_provisioning;
//----------------------------------------------------------------
namespace local {
class application {
public:
application(string const &cmd)
: cmd_(cmd) {
}
void usage(ostream &out) {
out << "Usage: " << cmd_ << " [options] <device or file>\n"
<< "Options:\n"
<< " {--thin1, --snap1}\n"
<< " {--thin2, --snap2}\n"
<< " {-m, --metadata-snap} [block#]\n"
<< " {--verbose}\n"
<< " {-h|--help}\n"
<< " {-V|--version}" << endl;
}
void die(string const &msg) {
cerr << msg << endl;
usage(cerr);
exit(1);
}
uint64_t parse_int(string const &str, string const &desc) {
try {
return boost::lexical_cast<uint64_t>(str);
} catch (...) {
ostringstream out;
out << "Couldn't parse " << desc << ": '" << str << "'";
die(out.str());
}
return 0; // never get here
}
private:
string cmd_;
};
namespace {
struct flags {
flags()
: verbose(false),
@ -96,13 +56,6 @@ namespace local {
uint64_t vbegin_, dbegin_, len_;
};
ostream &operator <<(ostream &out, mapping const &m) {
out << "mapping[vbegin = " << m.vbegin_
<< ", dbegin = " << m.dbegin_
<< ", len = " << m.len_ << "]";
return out;
}
//--------------------------------
template <typename Container>
@ -540,7 +493,7 @@ namespace local {
out << "</diff>\n";
}
void delta_(application &app, flags const &fs) {
void delta_(flags const &fs) {
mapping_recorder mr1;
mapping_recorder mr2;
damage_visitor damage_v;
@ -558,7 +511,7 @@ namespace local {
if (!snap1_root) {
ostringstream out;
out << "Unable to find mapping tree for snap1 (" << *fs.snap1 << ")";
app.die(out.str());
throw std::runtime_error(out.str());
}
single_mapping_tree snap1(*md->tm_, *snap1_root,
@ -570,7 +523,7 @@ namespace local {
if (!snap2_root) {
ostringstream out;
out << "Unable to find mapping tree for snap2 (" << *fs.snap2 << ")";
app.die(out.str());
throw std::runtime_error(out.str());
}
single_mapping_tree snap2(*md->tm_, *snap2_root,
@ -607,12 +560,12 @@ namespace local {
end_superblock(is);
}
int delta(application &app, flags const &fs) {
int delta(flags const &fs) {
try {
delta_(app, fs);
delta_(fs);
} catch (exception const &e) {
app.die(e.what());
return 1; // never get here
cerr << e.what() << endl;
return 1;
}
return 0;
@ -631,27 +584,31 @@ thin_delta_cmd::thin_delta_cmd()
void
thin_delta_cmd::usage(std::ostream &out) const
{
// FIXME: finish
out << "Usage: " << get_name() << " [options] <device or file>\n"
<< "Options:\n"
<< " {--thin1, --snap1}\n"
<< " {--thin2, --snap2}\n"
<< " {-m, --metadata-snap} [block#]\n"
<< " {--verbose}\n"
<< " {-h|--help}\n"
<< " {-V|--version}" << endl;
}
int
thin_delta_cmd::run(int argc, char **argv)
{
using namespace local;
int c;
flags fs;
local::application app(basename(argv[0]));
char const shortopts[] = "hVm::";
option const longopts[] = {
{ "help", no_argument, NULL, 'h' },
{ "metadata-snap", optional_argument, NULL, 'm' },
{ "version", no_argument, NULL, 'V' },
{ "thin1", required_argument, NULL, 1 },
{ "snap1", required_argument, NULL, 1 },
{ "thin2", required_argument, NULL, 2 },
{ "snap2", required_argument, NULL, 2 },
{ "metadata-snap", optional_argument, NULL, 'm' },
{ "verbose", no_argument, NULL, 4 },
{ NULL, no_argument, NULL, 0 }
};
@ -659,25 +616,25 @@ thin_delta_cmd::run(int argc, char **argv)
while ((c = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1) {
switch (c) {
case 'h':
app.usage(cout);
usage(cout);
return 0;
case 'm':
fs.use_metadata_snap = true;
if (optarg)
fs.metadata_snap = parse_uint64(optarg, "metadata snapshot block");
break;
case 'V':
cout << THIN_PROVISIONING_TOOLS_VERSION << endl;
return 0;
case 1:
fs.snap1 = app.parse_int(optarg, "thin id 1");
fs.snap1 = parse_uint64(optarg, "thin id 1");
break;
case 2:
fs.snap2 = app.parse_int(optarg, "thin id 2");
break;
case 'm':
fs.use_metadata_snap = true;
if (optarg)
fs.metadata_snap = app.parse_int(optarg, "metadata snapshot block");
fs.snap2 = parse_uint64(optarg, "thin id 2");
break;
case 4:
@ -685,23 +642,23 @@ thin_delta_cmd::run(int argc, char **argv)
break;
default:
app.usage(cerr);
usage(cerr);
return 1;
}
}
if (argc == optind)
app.die("No input device provided.");
die("No input device provided.");
else
fs.dev = argv[optind];
if (!fs.snap1)
app.die("--snap1 not specified.");
die("--snap1 not specified.");
if (!fs.snap2)
app.die("--snap2 not specified.");
die("--snap2 not specified.");
return delta(app, fs);
return delta(fs);
}
//----------------------------------------------------------------