aboutsummaryrefslogtreecommitdiff
path: root/bpkg/pkg-fetch.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-10-10 09:30:37 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-10-10 09:30:37 +0200
commitec931aa6550b47461e92062a703e6ef9f4c24b17 (patch)
tree711af30ebf02f7484dcc931d6b50fc148cd72983 /bpkg/pkg-fetch.cxx
parent4e3faacbc3c27e1d01ca95697b34db82cdecdb9d (diff)
Implement --replace|-r mode for pkg-unpack; improve in pkg-fetch
Diffstat (limited to 'bpkg/pkg-fetch.cxx')
-rw-r--r--bpkg/pkg-fetch.cxx33
1 files changed, 18 insertions, 15 deletions
diff --git a/bpkg/pkg-fetch.cxx b/bpkg/pkg-fetch.cxx
index c8b8543..fe8eca7 100644
--- a/bpkg/pkg-fetch.cxx
+++ b/bpkg/pkg-fetch.cxx
@@ -52,21 +52,24 @@ namespace bpkg
{
shared_ptr<selected_package> p (db.find<selected_package> (n));
- if (p == nullptr ||
- (p->state == package_state::fetched && o.replace ()))
- return p;
-
+ if (p != nullptr)
{
- diag_record dr (error);
+ bool s (p->state == package_state::fetched ||
+ p->state == package_state::unpacked);
+
+ if (!o.replace () || !s)
+ {
+ diag_record dr (fail);
- dr << "package " << n << " already exists in configuration " << c <<
- info << "version: " << p->version << ", state: " << p->state;
+ dr << "package " << n << " already exists in configuration " << c <<
+ info << "version: " << p->version << ", state: " << p->state;
- if (p->state == package_state::fetched)
- dr << info << "use 'pkg-fetch --replace|-r' to replace its archive";
+ if (s) // Suitable state for replace?
+ dr << info << "use 'pkg-fetch --replace|-r' to replace";
+ }
}
- throw failed ();
+ return p;
};
if (o.existing ())
@@ -167,14 +170,14 @@ namespace bpkg
if (sp != nullptr)
{
- // Clean up the archive we are replacing. Once this is done, there
- // is no going back. If things go badly, we can't simply abort the
- // transaction.
+ // Clean up the source directory and archive of the package we are
+ // replacing. Once this is done, there is no going back. If things
+ // go badly, we can't simply abort the transaction.
//
- if (sp->purge_archive)
- pkg_purge_archive (c, t, sp);
+ pkg_purge_fs (c, t, sp);
sp->version = move (m.version);
+ sp->state = package_state::fetched;
sp->repository = move (rl);
sp->archive = move (a);
sp->purge_archive = purge;