aboutsummaryrefslogtreecommitdiff
path: root/bpkg/pkg-fetch.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-09-15 10:58:17 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-09-15 10:58:17 +0200
commit333c5953151d6324d83d279a7ac3c53cd1af54b9 (patch)
treee473c5ca4461afcbdf67d5db42e883a1d76564e9 /bpkg/pkg-fetch.cxx
parentd05f9f046565f2d0d4135912103f96f0e66b454f (diff)
Implement pkg-verify, pkg-fetch commands
Diffstat (limited to 'bpkg/pkg-fetch.cxx')
-rw-r--r--bpkg/pkg-fetch.cxx114
1 files changed, 114 insertions, 0 deletions
diff --git a/bpkg/pkg-fetch.cxx b/bpkg/pkg-fetch.cxx
new file mode 100644
index 0000000..89283c6
--- /dev/null
+++ b/bpkg/pkg-fetch.cxx
@@ -0,0 +1,114 @@
+// file : bpkg/pkg-fetch.cxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#include <bpkg/pkg-fetch>
+
+#include <memory> // shared_ptr
+
+#include <bpkg/manifest>
+
+#include <bpkg/types>
+#include <bpkg/package>
+#include <bpkg/package-odb>
+#include <bpkg/utility>
+#include <bpkg/database>
+#include <bpkg/pkg-verify>
+#include <bpkg/diagnostics>
+
+using namespace std;
+using namespace butl;
+
+namespace bpkg
+{
+ void
+ pkg_fetch (const pkg_fetch_options& o, cli::scanner& args)
+ {
+ tracer trace ("pkg_fetch");
+
+ dir_path d (o.directory ());
+ level4 ([&]{trace << "configuration: " << d;});
+
+ database db (open (d));
+
+ path a;
+ bool purge;
+
+ if (o.archive ())
+ {
+ if (!args.more ())
+ fail << "archive path argument expected" <<
+ info << "run 'bpkg help pkg-fetch' for more information";
+
+ a = path (args.next ());
+
+ if (!exists (a))
+ fail << "archive file '" << a << "' does not exist";
+
+ purge = false;
+ }
+ else
+ {
+ if (!args.more ())
+ fail << "package name argument expected" <<
+ info << "run 'bpkg help pkg-fetch' for more information";
+
+ string name (args.next ());
+
+ if (!args.more ())
+ fail << "package version argument expected" <<
+ info << "run 'bpkg help pkg-fetch' for more information";
+
+ string ver (args.next ());
+
+ // TODO:
+ //
+ // - Will need to use some kind or auto_rm/exception guard on
+ // fetched file.
+ //
+
+ fail << "pkg-fetch " << name << " " << ver << " not yet implemented";
+ purge = true;
+ }
+
+ level4 ([&]{trace << "package archive: " << a << ", purge: " << purge;});
+
+ // Verify archive is a package and get its manifest.
+ //
+ package_manifest m (pkg_verify (a));
+ level4 ([&]{trace << m.name << " " << m.version;});
+
+ const auto& n (m.name);
+
+ // Database time.
+ //
+ transaction t (db.begin ());
+
+ // See if this package already exists in this configuration.
+ //
+ if (shared_ptr<package> p = db.find<package> (n))
+ fail << "package " << n << " already exists in configuration " << d <<
+ info << "existing version: " << p->version << ", state: " << p->state;
+
+ // Make the archive and configuration paths absolute and normalized.
+ // If the archive is inside the configuration, use the relative path.
+ // This way we can move configuration around.
+ //
+ d.complete ().normalize ();
+ a.complete ().normalize ();
+
+ if (a.sub (d))
+ a = a.leaf (d);
+
+ // Add the package to the configuration.
+ //
+ package p {move (m.name),
+ move (m.version),
+ state::fetched,
+ move (a),
+ purge};
+
+ db.persist (p);
+ t.commit ();
+ }
+}