diff options
-rw-r--r-- | bpkg/pkg-build.cli | 10 | ||||
-rw-r--r-- | bpkg/pkg-build.cxx | 63 | ||||
-rwxr-xr-x | tests/test.sh | 4 |
3 files changed, 44 insertions, 33 deletions
diff --git a/bpkg/pkg-build.cli b/bpkg/pkg-build.cli index aa16f58..c53c674 100644 --- a/bpkg/pkg-build.cli +++ b/bpkg/pkg-build.cli @@ -15,7 +15,7 @@ namespace bpkg "\h|SYNOPSIS| - \c{\b{bpkg pkg-build}|\b{build} [<options>] (<pkg>[/<ver>] | <file> | <dir>)...} + \c{\b{bpkg pkg-build}|\b{build} [<options>] (<pkg>[/<ver>] | <file> | <dir>/)...} \h|DESCRIPTION| @@ -27,10 +27,10 @@ namespace bpkg information on package repositories. Alternatively, the package can be specified as either the path to the - package archive (<file>) or to the package directory (<dir>). See the - \l{bpkg-pkg-fetch(1)} and \l{bpkg-pkg-unpack(1)} commands for more - information on the semantics of specifying the package as an archive or - a directory. + package archive (<file>) or to the package directory (<dir>/; note that + it must end with a directory separator). See the \l{bpkg-pkg-fetch(1)} + and \l{bpkg-pkg-unpack(1)} commands for more information on the semantics + of specifying the package as an archive or a directory. Packages that are specified explicitly on the command line will be \i{held}, that is, they will not be considered for automatic removal if diff --git a/bpkg/pkg-build.cxx b/bpkg/pkg-build.cxx index 6d00904..99d175b 100644 --- a/bpkg/pkg-build.cxx +++ b/bpkg/pkg-build.cxx @@ -7,6 +7,7 @@ #include <map> #include <set> #include <list> +#include <cstring> // strlen() #include <iterator> // make_move_iterator() #include <iostream> // cout #include <algorithm> // find() @@ -834,6 +835,7 @@ namespace bpkg for (bool diag (false); args.more (); ) { const char* s (args.peek ()); + size_t sn (strlen (s)); // Reduce all the potential variations (archive, directory, package // name, package name/version) to a single available_package object. @@ -879,35 +881,44 @@ namespace bpkg // Is this a package directory? // - try + // We used to just check any name which led to some really bizarre + // behavior where a sub-directory of the working directory happened + // to contain a manifest file and was therefore treated as a package + // directory. So now we will only do this test if the name ends with + // the directory separator. + // + if (sn != 0 && path::traits::is_separator (s[sn - 1])) { - dir_path d (s); - if (exists (d)) + try { - if (diag) - info << "'" << s << "' does not appear to be a valid package " - << "directory: "; - - package_manifest m (pkg_verify (d, true, diag)); - - // This is a package directory (note that we shouldn't throw - // failed from here on). - // - level4 ([&]{trace << "directory " << d;}); - n = m.name; - v = m.version; - ap = make_shared<available_package> (move (m)); - ar = root; - ap->locations.push_back (package_location {root, move (d)}); + dir_path d (s); + if (exists (d)) + { + if (diag) + info << "'" << s << "' does not appear to be a valid package " + << "directory: "; + + package_manifest m (pkg_verify (d, true, diag)); + + // This is a package directory (note that we shouldn't throw + // failed from here on). + // + level4 ([&]{trace << "directory " << d;}); + n = m.name; + v = m.version; + ap = make_shared<available_package> (move (m)); + ar = root; + ap->locations.push_back (package_location {root, move (d)}); + } + } + catch (const invalid_path&) + { + // Not a valid path so cannot be an archive. + } + catch (const failed&) + { + // Not a valid package archive. } - } - catch (const invalid_path&) - { - // Not a valid path so cannot be an archive. - } - catch (const failed&) - { - // Not a valid package archive. } // If this was a diagnostics "run", then we are done. diff --git a/tests/test.sh b/tests/test.sh index 2e7e29a..5a83191 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -811,7 +811,7 @@ fail pkg-build -p libfoo/1.0.0 # unknown package test pkg-build -p repository/1/satisfy/libfoo-1.1.0.tar.gz <<EOF build libfoo 1.1.0 EOF -test pkg-build -p repository/1/satisfy/libfoo-1.1.0 <<EOF +test pkg-build -p repository/1/satisfy/libfoo-1.1.0/ <<EOF build libfoo 1.1.0 EOF @@ -1158,7 +1158,7 @@ stat libbaz/1.1.0 "configured hold_package" test cfg-create --wipe test pkg-build -y repository/1/satisfy/libfoo-1.0.0.tar.gz stat libfoo "configured 1.0.0 hold_package hold_version" -test pkg-build -y repository/1/satisfy/libfoo-1.1.0 +test pkg-build -y repository/1/satisfy/libfoo-1.1.0/ stat libfoo "configured 1.1.0 hold_package hold_version" test cfg-create --wipe |