From 9caa44624c688ebba6bc041c273102150b1a59e7 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 29 Aug 2018 14:35:51 +0200 Subject: Add --{repositories|packages}-file options to bpkg-rep-info This allows saving both manifests with a single invocation (which is the only way to guarantee they are consistent). --- bpkg/rep-info.cxx | 83 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 71 insertions(+), 12 deletions(-) (limited to 'bpkg/rep-info.cxx') diff --git a/bpkg/rep-info.cxx b/bpkg/rep-info.cxx index b551084..35b06ca 100644 --- a/bpkg/rep-info.cxx +++ b/bpkg/rep-info.cxx @@ -33,6 +33,14 @@ namespace bpkg fail << "repository location argument expected" << info << "run 'bpkg help rep-info' for more information"; + if ((o.repositories_file_specified () || o.packages_file_specified ()) && + !o.manifest ()) + fail << (o.repositories_file_specified () + ? "--repositories-file" + : "--packages-file") + << " specified without --manifest" << + info << "run 'bpkg help rep-info' for more information"; + repository_location rl ( parse_location (args.next (), o.type_specified () @@ -175,14 +183,38 @@ namespace bpkg rms.push_back ( find_base_repository (rfd.fragments.back ().repositories)); - // Note: serializing without any extra repository_manifests info. - // - manifest_serializer s (cout, "stdout"); + auto serialize = [&rms] (ostream& os, const string& name) + { + // Note: serializing without any extra repository_manifests info. + // + manifest_serializer s (os, name); - for (const repository_manifest& rm: rms) - rm.serialize (s); + for (const repository_manifest& rm: rms) + rm.serialize (s); + + s.next ("", ""); // End of stream. + }; + + if (o.repositories_file_specified ()) + { + const path& p (o.repositories_file ()); - s.next ("", ""); // End of stream. + try + { + // Let's set the binary mode not to litter the manifest file + // with the carriage return characters on Windows. + // + ofdstream ofs (p, ios::binary); + serialize (ofs, p.string ()); + ofs.close (); + } + catch (const io_error& e) + { + fail << "unable to write to " << p << ": " << e; + } + } + else + serialize (cout, "stdout"); } else { @@ -266,12 +298,39 @@ namespace bpkg } } - // Note: serializing without any extra package_manifests info. - // - manifest_serializer s (cout, "stdout"); - for (const package_manifest& pm: pms) - pm.serialize (s); - s.next ("", ""); // End of stream. + auto serialize = [&pms] (ostream& os, const string& name) + { + // Note: serializing without any extra package_manifests info. + // + manifest_serializer s (os, name); + + for (const package_manifest& pm: pms) + pm.serialize (s); + + s.next ("", ""); // End of stream. + }; + + if (o.packages_file_specified ()) + { + const path& p (o.packages_file ()); + + try + { + // Let's set the binary mode not to litter the manifest file + // with the carriage return characters on Windows. + // + ofdstream ofs (p, ios::binary); + serialize (ofs, p.string ()); + ofs.close (); + } + catch (const io_error& e) + { + fail << "unable to write to " << p << ": " << e; + } + } + else + serialize (cout, "stdout"); + } else { -- cgit v1.1