aboutsummaryrefslogtreecommitdiff
path: root/libbpkg/manifest.cxx
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2018-04-30 12:46:10 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2018-05-01 20:35:11 +0300
commit05e0f5ca9e9a916746bd6b26baff317663674574 (patch)
tree059e0e4f2030ea8596cf5de21e6dfe692a46e790 /libbpkg/manifest.cxx
parent99dc5d7463236ee9c094736dfbcb56641e782335 (diff)
Add support for default and excluding git ref filters
Diffstat (limited to 'libbpkg/manifest.cxx')
-rw-r--r--libbpkg/manifest.cxx45
1 files changed, 31 insertions, 14 deletions
diff --git a/libbpkg/manifest.cxx b/libbpkg/manifest.cxx
index ab3acf1..78e3f2e 100644
--- a/libbpkg/manifest.cxx
+++ b/libbpkg/manifest.cxx
@@ -2320,36 +2320,43 @@ namespace bpkg
// git_ref_filter
//
git_ref_filter::
- git_ref_filter (const string& frag)
+ git_ref_filter (const string& rf)
{
- size_t p (frag.find ('@'));
+ exclusion = rf[0] == '-';
+
+ // Strip the leading +/-.
+ //
+ const string& s (exclusion || rf[0] == '+' ? string (rf, 1) : rf);
+
+ size_t p (s.find ('@'));
+
if (p != string::npos)
{
if (p != 0)
- name = string (frag, 0, p);
+ name = string (s, 0, p);
- if (p + 1 != frag.size ())
- commit = string (frag, p + 1);
+ if (p + 1 != s.size ())
+ commit = string (s, p + 1);
}
- else if (!frag.empty ())
+ else if (!s.empty ())
{
// A 40-characters fragment that consists of only hexadecimal digits is
// assumed to be a commit id.
//
- if (frag.size () == 40 &&
- find_if_not (frag.begin (), frag.end (),
+ if (s.size () == 40 &&
+ find_if_not (s.begin (), s.end (),
// Resolve the required overload.
//
- static_cast<bool (*)(char)> (xdigit)) == frag.end ())
- commit = frag;
+ static_cast<bool (*)(char)> (xdigit)) == s.end ())
+ commit = s;
else
- name = frag;
+ name = s;
}
if (!name && !commit)
throw invalid_argument (
- "missing reference name or commit id for git repository");
+ "missing refname or commit id for git repository");
if (commit && commit->size () != 40)
throw invalid_argument (
@@ -2357,10 +2364,20 @@ namespace bpkg
}
git_ref_filters
- parse_git_ref_filters (const string& s)
+ parse_git_ref_filters (const optional<string>& fs)
{
+ if (!fs)
+ return git_ref_filters ({git_ref_filter ()});
+
+ const string& s (*fs);
+
git_ref_filters r;
- for (size_t p (0); p != string::npos; )
+ bool def (s[0] == '#');
+
+ if (def)
+ r.push_back (git_ref_filter ());
+
+ for (size_t p (def ? 1 : 0); p != string::npos; )
{
size_t e (s.find (',', p));
r.emplace_back (string (s, p, e != string::npos ? e - p : e));