diff --git a/.augeas.metadata b/.augeas.metadata
index a966240..9d7d730 100644
--- a/.augeas.metadata
+++ b/.augeas.metadata
@@ -1 +1 @@
-3cfa4870fac3b6697e8039cb611cb0c5a75498a4 SOURCES/augeas-1.10.1.tar.gz
+afe7aee292e058141d8c19f6a82b5f8bae2d5163 SOURCES/augeas-1.12.0.tar.gz
diff --git a/.gitignore b/.gitignore
index 83a3dbf..9c1c5c4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/augeas-1.10.1.tar.gz
+SOURCES/augeas-1.12.0.tar.gz
diff --git a/SOURCES/0001-Fix-several-memory-leak-in-augmatch.patch b/SOURCES/0001-Fix-several-memory-leak-in-augmatch.patch
deleted file mode 100644
index 60022fe..0000000
--- a/SOURCES/0001-Fix-several-memory-leak-in-augmatch.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From 0cfb9fc93b4cd967c9f8bb2f50df5ccff84a497e Mon Sep 17 00:00:00 2001
-From: Han Han <hhan@redhat.com>
-Date: Mon, 9 Apr 2018 15:59:45 +0800
-Subject: [PATCH] Fix several memory leak in augmatch
-
-(cherry picked from commit 46a62a71553c6bac8f61ecc2a33f65b13e7ad2c0)
----
- src/augmatch.c | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
-
-diff --git a/src/augmatch.c b/src/augmatch.c
-index 20045c5f..1ac9b680 100644
---- a/src/augmatch.c
-+++ b/src/augmatch.c
-@@ -131,6 +131,7 @@ static void check_load_error(struct augeas *aug, const char *file) {
-     const char *msg, *line, *col;
- 
-     aug_defvar(aug, "info", info);
-+    free(info);
-     die(aug_ns_count(aug, "info") == 0, "file %s does not exist\n", file);
- 
-     aug_defvar(aug, "error", "$info/error");
-@@ -240,7 +241,7 @@ static void print_tree(struct augeas *aug, int level,
- static void print(struct augeas *aug, const char *path, const char *match) {
-     static const char *const match_var = "match";
- 
--    cleanup(freep) struct node *nodes = NULL;
-+    struct node *nodes = NULL;
- 
-     nodes = calloc(max_nodes, sizeof(struct node));
-     oom_when(nodes == NULL);
-@@ -265,6 +266,10 @@ static void print(struct augeas *aug, const char *path, const char *match) {
-         aug_defvar(aug, nodes[0].var, prefix);
-         print_tree(aug, 0, prefix + strlen(path) + 1, nodes);
-     }
-+    for (int i=0; i < max_nodes; i++) {
-+        free(nodes[i].var);
-+    }
-+    free(nodes);
- }
- 
- /* Look at the filename and try to guess based on the extension. The
-@@ -421,6 +426,7 @@ int main(int argc, char **argv) {
-     }
- 
-     print(aug, path, match);
-+    free(path);
- }
- 
- /*
--- 
-2.17.2
-
diff --git a/SOURCES/0002-Use-a-safer-calling-convention-for-native-functions.patch b/SOURCES/0002-Use-a-safer-calling-convention-for-native-functions.patch
deleted file mode 100644
index b55b882..0000000
--- a/SOURCES/0002-Use-a-safer-calling-convention-for-native-functions.patch
+++ /dev/null
@@ -1,464 +0,0 @@
-From c514988fa3ff57e7622678963c1141b59b4d88d7 Mon Sep 17 00:00:00 2001
-From: David Lutterkort <lutter@watzmann.net>
-Date: Mon, 4 Jun 2018 23:19:28 -0700
-Subject: [PATCH] Use a safer calling convention for native functions
-
-The native functions in the lens interpreter used a calling convention that
-required unsafe casting of function pointers. We now use a calling
-convention that does not cause any function pointer casts.
-
-(cherry picked from commit 31c3532e5e8d4707dfb7de12278221001dafdd5a)
----
- src/builtin.c | 161 +++++++++++++++++++++++++++++++++-----------------
- src/syntax.c  |  34 ++---------
- src/syntax.h  |  11 +++-
- 3 files changed, 119 insertions(+), 87 deletions(-)
-
-diff --git a/src/builtin.c b/src/builtin.c
-index 732ee10c..7cf4fa0a 100644
---- a/src/builtin.c
-+++ b/src/builtin.c
-@@ -42,8 +42,10 @@
-  */
- 
- /* V_REGEXP -> V_STRING -> V_LENS */
--static struct value *lns_del(struct info *info,
--                             struct value *rxp, struct value *dflt) {
-+static struct value *lns_del(struct info *info, struct value **argv) {
-+    struct value *rxp = argv[0];
-+    struct value *dflt = argv[1];
-+
-     assert(rxp->tag == V_REGEXP);
-     assert(dflt->tag == V_STRING);
-     return lns_make_prim(L_DEL, ref(info),
-@@ -51,44 +53,59 @@ static struct value *lns_del(struct info *info,
- }
- 
- /* V_REGEXP -> V_LENS */
--static struct value *lns_store(struct info *info, struct value *rxp) {
-+static struct value *lns_store(struct info *info, struct value **argv) {
-+    struct value *rxp = argv[0];
-+
-     assert(rxp->tag == V_REGEXP);
-     return lns_make_prim(L_STORE, ref(info), ref(rxp->regexp), NULL);
- }
- 
- /* V_STRING -> V_LENS */
--static struct value *lns_value(struct info *info, struct value *str) {
-+static struct value *lns_value(struct info *info, struct value **argv) {
-+    struct value *str = argv[0];
-+
-     assert(str->tag == V_STRING);
-     return lns_make_prim(L_VALUE, ref(info), NULL, ref(str->string));
- }
- 
- /* V_REGEXP -> V_LENS */
--static struct value *lns_key(struct info *info, struct value *rxp) {
-+static struct value *lns_key(struct info *info, struct value **argv) {
-+    struct value *rxp = argv[0];
-+
-     assert(rxp->tag == V_REGEXP);
-     return lns_make_prim(L_KEY, ref(info), ref(rxp->regexp), NULL);
- }
- 
- /* V_STRING -> V_LENS */
--static struct value *lns_label(struct info *info, struct value *str) {
-+static struct value *lns_label(struct info *info, struct value **argv) {
-+    struct value *str = argv[0];
-+
-     assert(str->tag == V_STRING);
-     return lns_make_prim(L_LABEL, ref(info), NULL, ref(str->string));
- }
- 
- /* V_STRING -> V_LENS */
--static struct value *lns_seq(struct info *info, struct value *str) {
-+static struct value *lns_seq(struct info *info, struct value **argv) {
-+    struct value *str = argv[0];
-+
-     assert(str->tag == V_STRING);
-     return lns_make_prim(L_SEQ, ref(info), NULL, ref(str->string));
- }
- 
- /* V_STRING -> V_LENS */
--static struct value *lns_counter(struct info *info, struct value *str) {
-+static struct value *lns_counter(struct info *info, struct value **argv) {
-+    struct value *str = argv[0];
-+
-     assert(str->tag == V_STRING);
-     return lns_make_prim(L_COUNTER, ref(info), NULL, ref(str->string));
- }
- 
- /* V_LENS -> V_LENS -> V_LENS -> V_LENS */
--static struct value *lns_square(struct info *info, struct value *l1,
--                                struct value *l2, struct value *l3) {
-+static struct value *lns_square(struct info *info, struct value **argv) {
-+    struct value *l1 = argv[0];
-+    struct value *l2 = argv[1];
-+    struct value *l3 = argv[2];
-+
-     assert(l1->tag == V_LENS);
-     assert(l2->tag == V_LENS);
-     assert(l3->tag == V_LENS);
-@@ -179,8 +196,10 @@ static struct value *pathx_parse_glue(struct info *info, struct value *tree,
- }
- 
- /* V_LENS -> V_STRING -> V_TREE */
--static struct value *lens_get(struct info *info, struct value *l,
--                              struct value *str) {
-+static struct value *lens_get(struct info *info, struct value **argv) {
-+    struct value *l = argv[0];
-+    struct value *str = argv[1];
-+
-     assert(l->tag == V_LENS);
-     assert(str->tag == V_STRING);
-     struct lns_error *err;
-@@ -210,8 +229,11 @@ static struct value *lens_get(struct info *info, struct value *l,
- 
- 
- /* V_LENS -> V_TREE -> V_STRING -> V_STRING */
--static struct value *lens_put(struct info *info, struct value *l,
--                              struct value *tree, struct value *str) {
-+static struct value *lens_put(struct info *info, struct value **argv) {
-+    struct value *l    = argv[0];
-+    struct value *tree = argv[1];
-+    struct value *str  = argv[2];
-+
-     assert(l->tag == V_LENS);
-     assert(tree->tag == V_TREE);
-     assert(str->tag == V_STRING);
-@@ -237,11 +259,14 @@ static struct value *lens_put(struct info *info, struct value *l,
- }
- 
- /* V_STRING -> V_STRING -> V_TREE -> V_TREE */
--static struct value *tree_set_glue(struct info *info, struct value *path,
--                                   struct value *val, struct value *tree) {
-+static struct value *tree_set_glue(struct info *info, struct value **argv) {
-     // FIXME: This only works if TREE is not referenced more than once;
-     // otherwise we'll have some pretty weird semantics, and would really
-     // need to copy TREE first
-+    struct value *path = argv[0];
-+    struct value *val  = argv[1];
-+    struct value *tree = argv[2];
-+
-     assert(path->tag == V_STRING);
-     assert(val->tag == V_STRING);
-     assert(tree->tag == V_TREE);
-@@ -277,11 +302,13 @@ static struct value *tree_set_glue(struct info *info, struct value *path,
- }
- 
- /* V_STRING -> V_TREE -> V_TREE */
--static struct value *tree_clear_glue(struct info *info, struct value *path,
--                                     struct value *tree) {
-+static struct value *tree_clear_glue(struct info *info, struct value **argv) {
-     // FIXME: This only works if TREE is not referenced more than once;
-     // otherwise we'll have some pretty weird semantics, and would really
-     // need to copy TREE first
-+    struct value *path = argv[0];
-+    struct value *tree = argv[1];
-+
-     assert(path->tag == V_STRING);
-     assert(tree->tag == V_TREE);
- 
-@@ -349,25 +376,32 @@ static struct value *tree_insert_glue(struct info *info, struct value *label,
- 
- /* Insert after */
- /* V_STRING -> V_STRING -> V_TREE -> V_TREE */
--static struct value *tree_insa_glue(struct info *info, struct value *label,
--                                    struct value *path, struct value *tree) {
-+static struct value *tree_insa_glue(struct info *info, struct value **argv) {
-+    struct value *label = argv[0];
-+    struct value *path  = argv[1];
-+    struct value *tree  = argv[2];
-+
-     return tree_insert_glue(info, label, path, tree, 0);
- }
- 
- /* Insert before */
- /* V_STRING -> V_STRING -> V_TREE -> V_TREE */
--static struct value *tree_insb_glue(struct info *info, struct value *label,
--                                    struct value *path, struct value *tree) {
-+static struct value *tree_insb_glue(struct info *info, struct value **argv) {
-+    struct value *label = argv[0];
-+    struct value *path  = argv[1];
-+    struct value *tree  = argv[2];
-+
-     return tree_insert_glue(info, label, path, tree, 1);
- }
- 
- /* V_STRING -> V_TREE -> V_TREE */
--static struct value *tree_rm_glue(struct info *info,
--                                  struct value *path,
--                                  struct value *tree) {
-+static struct value *tree_rm_glue(struct info *info, struct value **argv) {
-     // FIXME: This only works if TREE is not referenced more than once;
-     // otherwise we'll have some pretty weird semantics, and would really
-     // need to copy TREE first
-+    struct value *path  = argv[0];
-+    struct value *tree  = argv[1];
-+
-     assert(path->tag == V_STRING);
-     assert(tree->tag == V_TREE);
- 
-@@ -390,7 +424,9 @@ static struct value *tree_rm_glue(struct info *info,
- }
- 
- /* V_STRING -> V_STRING */
--static struct value *gensym(struct info *info, struct value *prefix) {
-+static struct value *gensym(struct info *info, struct value **argv) {
-+    struct value *prefix = argv[0];
-+
-     assert(prefix->tag == V_STRING);
-     static unsigned int count = 0;
-     struct value *v;
-@@ -406,7 +442,9 @@ static struct value *gensym(struct info *info, struct value *prefix) {
- }
- 
- /* V_STRING -> V_FILTER */
--static struct value *xform_incl(struct info *info, struct value *s) {
-+static struct value *xform_incl(struct info *info, struct value **argv) {
-+    struct value *s = argv[0];
-+
-     assert(s->tag == V_STRING);
-     struct value *v = make_value(V_FILTER, ref(info));
-     v->filter = make_filter(ref(s->string), 1);
-@@ -414,7 +452,9 @@ static struct value *xform_incl(struct info *info, struct value *s) {
- }
- 
- /* V_STRING -> V_FILTER */
--static struct value *xform_excl(struct info *info, struct value *s) {
-+static struct value *xform_excl(struct info *info, struct value **argv) {
-+    struct value *s = argv[0];
-+
-     assert(s->tag == V_STRING);
-     struct value *v = make_value(V_FILTER, ref(info));
-     v->filter = make_filter(ref(s->string), 0);
-@@ -422,8 +462,10 @@ static struct value *xform_excl(struct info *info, struct value *s) {
- }
- 
- /* V_LENS -> V_FILTER -> V_TRANSFORM */
--static struct value *xform_transform(struct info *info, struct value *l,
--                                     struct value *f) {
-+static struct value *xform_transform(struct info *info, struct value **argv) {
-+    struct value *l = argv[0];
-+    struct value *f = argv[1];
-+
-     assert(l->tag == V_LENS);
-     assert(f->tag == V_FILTER);
-     if (l->lens->value || l->lens->key) {
-@@ -436,14 +478,16 @@ static struct value *xform_transform(struct info *info, struct value *l,
-     return v;
- }
- 
--static struct value *sys_getenv(struct info *info, struct value *n) {
--    assert(n->tag == V_STRING);
-+static struct value *sys_getenv(struct info *info, struct value **argv) {
-+    assert(argv[0]->tag == V_STRING);
-     struct value *v = make_value(V_STRING, ref(info));
--    v->string = dup_string(getenv(n->string->str));
-+    v->string = dup_string(getenv(argv[0]->string->str));
-     return v;
- }
- 
--static struct value *sys_read_file(struct info *info, struct value *n) {
-+static struct value *sys_read_file(struct info *info, struct value **argv) {
-+    struct value *n = argv[0];
-+
-     assert(n->tag == V_STRING);
-     char *str = NULL;
- 
-@@ -464,7 +508,10 @@ static struct value *sys_read_file(struct info *info, struct value *n) {
- 
- /* V_LENS -> V_LENS */
- static struct value *lns_check_rec_glue(struct info *info,
--                                        struct value *l, struct value *r) {
-+                                        struct value **argv) {
-+    struct value *l = argv[0];
-+    struct value *r = argv[1];
-+
-     assert(l->tag == V_LENS);
-     assert(r->tag == V_LENS);
-     int check = typecheck_p(info);
-@@ -477,28 +524,28 @@ static struct value *lns_check_rec_glue(struct info *info,
-  */
- 
- /* V_STRING -> V_UNIT */
--static struct value *pr_string(struct info *info, struct value *s) {
--    printf("%s", s->string->str);
-+static struct value *pr_string(struct info *info, struct value **argv) {
-+    printf("%s", argv[0]->string->str);
-     return make_unit(ref(info));
- }
- 
- /* V_REGEXP -> V_UNIT */
--static struct value *pr_regexp(struct info *info, struct value *r) {
--    print_regexp(stdout, r->regexp);
-+static struct value *pr_regexp(struct info *info, struct value **argv) {
-+    print_regexp(stdout, argv[0]->regexp);
-     return make_unit(ref(info));
- }
- 
- /* V_STRING -> V_UNIT */
--static struct value *pr_endline(struct info *info, struct value *s) {
--    printf("%s\n", s->string->str);
-+static struct value *pr_endline(struct info *info, struct value **argv) {
-+    printf("%s\n", argv[0]->string->str);
-     return make_unit(ref(info));
- }
- 
- /* V_TREE -> V_TREE */
- static struct value *pr_tree(ATTRIBUTE_UNUSED struct info *info,
--                             struct value *t) {
--    print_tree_braces(stdout, 0, t->origin);
--    return ref(t);
-+                             struct value **argv) {
-+    print_tree_braces(stdout, 0, argv[0]->origin);
-+    return ref(argv[0]);
- }
- 
- /*
-@@ -515,27 +562,29 @@ static struct value *lns_value_of_type(struct info *info, struct regexp *rx) {
- }
- 
- /* V_LENS -> V_REGEXP */
--static struct value *lns_ctype(struct info *info, struct value *l) {
--    return lns_value_of_type(info, l->lens->ctype);
-+static struct value *lns_ctype(struct info *info, struct value **argv) {
-+    return lns_value_of_type(info, argv[0]->lens->ctype);
- }
- 
- /* V_LENS -> V_REGEXP */
--static struct value *lns_atype(struct info *info, struct value *l) {
--    return lns_value_of_type(info, l->lens->atype);
-+static struct value *lns_atype(struct info *info, struct value **argv) {
-+    return lns_value_of_type(info, argv[0]->lens->atype);
- }
- 
- /* V_LENS -> V_REGEXP */
--static struct value *lns_vtype(struct info *info, struct value *l) {
--    return lns_value_of_type(info, l->lens->vtype);
-+static struct value *lns_vtype(struct info *info, struct value **argv) {
-+    return lns_value_of_type(info, argv[0]->lens->vtype);
- }
- 
- /* V_LENS -> V_REGEXP */
--static struct value *lns_ktype(struct info *info, struct value *l) {
--    return lns_value_of_type(info, l->lens->ktype);
-+static struct value *lns_ktype(struct info *info, struct value **argv) {
-+    return lns_value_of_type(info, argv[0]->lens->ktype);
- }
- 
- /* V_LENS -> V_STRING */
--static struct value *lns_fmt_atype(struct info *info, struct value *l) {
-+static struct value *lns_fmt_atype(struct info *info, struct value **argv) {
-+    struct value *l = argv[0];
-+
-     struct value *result = NULL;
-     char *s = NULL;
-     int r;
-@@ -549,8 +598,10 @@ static struct value *lns_fmt_atype(struct info *info, struct value *l) {
- }
- 
- /* V_REGEXP -> V_STRING -> V_STRING */
--static struct value *rx_match(struct info *info,
--                              struct value *rx, struct value *s) {
-+static struct value *rx_match(struct info *info, struct value **argv) {
-+    struct value *rx = argv[0];
-+    struct value *s  = argv[1];
-+
-     struct value *result = NULL;
-     const char *str = s->string->str;
-     struct re_registers regs;
-diff --git a/src/syntax.c b/src/syntax.c
-index 612544c7..d26babcc 100644
---- a/src/syntax.c
-+++ b/src/syntax.c
-@@ -1023,42 +1023,16 @@ typedef struct value *(*impl5)(struct info *, struct value *, struct value *,
- 
- static struct value *native_call(struct info *info,
-                                  struct native *func, struct ctx *ctx) {
--    struct value *argv[func->argc];
-+    struct value *argv[func->argc + 1];
-     struct binding *b = ctx->local;
--    struct value *result;
- 
-     for (int i = func->argc - 1; i >= 0; i--) {
-         argv[i] = b->value;
-         b = b->next;
-     }
-+    argv[func->argc] = NULL;
- 
--    switch(func->argc) {
--    case 0:
--        result = ((impl0) *func->impl)(info);
--        break;
--    case 1:
--        result = ((impl1) *func->impl)(info, argv[0]);
--        break;
--    case 2:
--        result = ((impl2) *func->impl)(info, argv[0], argv[1]);
--        break;
--    case 3:
--        result = ((impl3) *func->impl)(info, argv[0], argv[1], argv[2]);
--        break;
--    case 4:
--        result = ((impl4) *func->impl)(info, argv[0], argv[1], argv[2], argv[3]);
--        break;
--    case 5:
--        result = ((impl5) *func->impl)(info, argv[0], argv[1], argv[2], argv[3],
--                                       argv[4]);
--        break;
--    default:
--        assert(0);
--        abort();
--        break;
--    }
--
--    return result;
-+    return func->impl(info, argv);
- }
- 
- static void type_error1(struct info *info, const char *msg, struct type *type) {
-@@ -1857,7 +1831,7 @@ make_native_info(struct error *error, const char *fname, int line) {
- int define_native_intl(const char *file, int line,
-                        struct error *error,
-                        struct module *module, const char *name,
--                       int argc, void *impl, ...) {
-+                       int argc, func_impl impl, ...) {
-     assert(argc > 0);  /* We have no unit type */
-     assert(argc <= 5);
-     va_list ap;
-diff --git a/src/syntax.h b/src/syntax.h
-index 12c3bae4..30aefe58 100644
---- a/src/syntax.h
-+++ b/src/syntax.h
-@@ -112,10 +112,17 @@ struct param {
-     struct type   *type;
- };
- 
-+/* The protoype for the implementation of a native/builtin function in the
-+ * interpreter.
-+ *
-+ * The arguments are passed as a NULL-terminated array of values.
-+ */
-+typedef struct value *(*func_impl)(struct info *, struct value *argv[]);
-+
- struct native {
-     unsigned int argc;
-     struct type *type;
--    struct value *(*impl)(void);
-+    func_impl    impl;
- };
- 
- /* An exception in the interpreter. Some exceptions are reported directly
-@@ -270,7 +277,7 @@ ATTRIBUTE_RETURN_CHECK
- int define_native_intl(const char *fname, int line,
-                        struct error *error,
-                        struct module *module, const char *name,
--                       int argc, void *impl, ...);
-+                       int argc, func_impl impl, ...);
- 
- struct module *builtin_init(struct error *);
- 
--- 
-2.17.2
-
diff --git a/SOURCES/0003-src-augeas.c-aug_source-actually-return-the-source-f.patch b/SOURCES/0003-src-augeas.c-aug_source-actually-return-the-source-f.patch
deleted file mode 100644
index c4bed1d..0000000
--- a/SOURCES/0003-src-augeas.c-aug_source-actually-return-the-source-f.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 47ec34301b9a797e9a6cb8b24adf9fc7fb3bbbd3 Mon Sep 17 00:00:00 2001
-From: David Lutterkort <lutter@watzmann.net>
-Date: Mon, 29 Jan 2018 14:03:36 +0100
-Subject: [PATCH] * src/augeas.c (aug_source): actually return the source for
- the node
-
-(cherry picked from commit 70481d8e09af372f168a38755ae3173df1fe43d9)
----
- src/augeas.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/augeas.c b/src/augeas.c
-index 8ec264cf..df760f50 100644
---- a/src/augeas.c
-+++ b/src/augeas.c
-@@ -1958,7 +1958,7 @@ int aug_source(const augeas *aug, const char *path, char **file_path) {
-     ERR_THROW(r == 0, aug, AUG_ENOMATCH, "There is no node matching %s",
-               path);
- 
--    tree_source(aug, match);
-+    *file_path = tree_source(aug, match);
-     ERR_BAIL(aug);
- 
-     result = 0;
--- 
-2.17.2
-
diff --git a/SOURCES/0004-tests-test-api.c-add-a-check-for-aug_source.patch b/SOURCES/0004-tests-test-api.c-add-a-check-for-aug_source.patch
deleted file mode 100644
index 5f5f746..0000000
--- a/SOURCES/0004-tests-test-api.c-add-a-check-for-aug_source.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-From 8686eeeea05de0c5a3aeccfa7560b7668635b99e Mon Sep 17 00:00:00 2001
-From: David Lutterkort <lutter@watzmann.net>
-Date: Mon, 11 Jun 2018 12:20:31 -0700
-Subject: [PATCH] * tests/test-api.c: add a check for aug_source
-
-(cherry picked from commit 74e2f6c74e2e910034339dcda2d46c9aa3f83776)
----
- src/augeas.h     |  2 ++
- tests/test-api.c | 36 ++++++++++++++++++++++++++++++++++++
- 2 files changed, 38 insertions(+)
-
-diff --git a/src/augeas.h b/src/augeas.h
-index d6a1a707..a8770790 100644
---- a/src/augeas.h
-+++ b/src/augeas.h
-@@ -403,6 +403,8 @@ int aug_print(const augeas *aug, FILE *out, const char *path);
-  * contain the path to the toplevel node of that file underneath /files. If
-  * it does not, *FILE_PATH will be NULL.
-  *
-+ * The caller is responsible for freeing *FILE_PATH
-+ *
-  * Returns:
-  * 0 on success, or a negative value on failure. It is an error if PATH
-  * matches more than one node.
-diff --git a/tests/test-api.c b/tests/test-api.c
-index fda8ab6a..6460d7ba 100644
---- a/tests/test-api.c
-+++ b/tests/test-api.c
-@@ -816,6 +816,41 @@ static void testAugNs(CuTest *tc) {
-     aug_close(aug);
- }
- 
-+/* Test aug_source */
-+static void testAugSource(CuTest *tc) {
-+    struct augeas *aug;
-+    int r;
-+    char *s;
-+
-+    aug = aug_init(root, loadpath, AUG_NO_STDINC|AUG_NO_LOAD);
-+    CuAssertPtrNotNull(tc, aug);
-+    CuAssertIntEquals(tc, AUG_NOERROR, aug_error(aug));
-+
-+    r = aug_load_file(aug, "/etc/hosts");
-+    CuAssertIntEquals(tc, 0, r);
-+
-+    r = aug_source(aug, "/files/etc/hosts/1", &s);
-+    CuAssertIntEquals(tc, 0, r);
-+    CuAssertStrEquals(tc, "/files/etc/hosts", s);
-+    free(s);
-+
-+    r = aug_source(aug, "/files/etc/fstab", &s);
-+    CuAssertIntEquals(tc, -1, r);
-+    CuAssertIntEquals(tc, AUG_ENOMATCH, aug_error(aug));
-+    CuAssertPtrEquals(tc, NULL, s);
-+
-+    r = aug_source(aug, "/files[", &s);
-+    CuAssertIntEquals(tc, -1, r);
-+    CuAssertIntEquals(tc, AUG_EPATHX, aug_error(aug));
-+    CuAssertPtrEquals(tc, NULL, s);
-+
-+    r = aug_source(aug, "/files/etc/hosts/*", &s);
-+    CuAssertIntEquals(tc, -1, r);
-+    CuAssertIntEquals(tc, AUG_EMMATCH, aug_error(aug));
-+    CuAssertPtrEquals(tc, NULL, s);
-+
-+}
-+
- int main(void) {
-     char *output = NULL;
-     CuSuite* suite = CuSuiteNew();
-@@ -840,6 +875,7 @@ int main(void) {
-     SUITE_ADD_TEST(suite, testLoadBadPath);
-     SUITE_ADD_TEST(suite, testLoadBadLens);
-     SUITE_ADD_TEST(suite, testAugNs);
-+    SUITE_ADD_TEST(suite, testAugSource);
- 
-     abs_top_srcdir = getenv("abs_top_srcdir");
-     if (abs_top_srcdir == NULL)
--- 
-2.17.2
-
diff --git a/SOURCES/0005-src-augtool.c-fix-access-to-invalid-memory.patch b/SOURCES/0005-src-augtool.c-fix-access-to-invalid-memory.patch
deleted file mode 100644
index 47423d5..0000000
--- a/SOURCES/0005-src-augtool.c-fix-access-to-invalid-memory.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From 78c87b3f3b359fac5401f81a86dd9e2f5968220e Mon Sep 17 00:00:00 2001
-From: Pino Toscano <ptoscano@redhat.com>
-Date: Thu, 19 Jul 2018 15:43:21 +0200
-Subject: [PATCH] * src/augtool.c: fix access to invalid memory
-
-When stripping the context from the result, readline_path_generator used
-to realloc the string to a shorter size, copying only the content after
-the prefix.  This resulted in reading with strcpy  from the previous
-memory, which is freed already.  Avoid the issue, and simplify the code
-by using strdup, freeing the old string.
-
-This issue could be reproduced in augtool, trying to autocomplete files
-without the /files prefix, e.g.:
-  augtool> ls <TAB><TAB>
-
-(cherry picked from commit 05b5784b2029f198ea486738d33fb7b49ef23eb8)
----
- src/augtool.c | 10 ++++------
- 1 file changed, 4 insertions(+), 6 deletions(-)
-
-diff --git a/src/augtool.c b/src/augtool.c
-index ff097bd9..2745812c 100644
---- a/src/augtool.c
-+++ b/src/augtool.c
-@@ -153,15 +153,13 @@ static char *readline_path_generator(const char *text, int state) {
- 
-             /* strip off context if the user didn't give it */
-             if (ctx != NULL) {
--                char *c = realloc(child, strlen(child)-strlen(ctx)+1);
--                if (c == NULL) {
--                    free(child);
--                    return NULL;
--                }
-                 int ctxidx = strlen(ctx);
-                 if (child[ctxidx] == SEP)
-                     ctxidx++;
--                strcpy(c, &child[ctxidx]);
-+                char *c = strdup(&child[ctxidx]);
-+                free(child);
-+                if (c == NULL)
-+                    return NULL;
-                 child = c;
-             }
- 
--- 
-2.17.2
-
diff --git a/SOURCES/0006-src-fa.c-fa_dot_debug-check-result-of-fopen.patch b/SOURCES/0006-src-fa.c-fa_dot_debug-check-result-of-fopen.patch
deleted file mode 100644
index 583616f..0000000
--- a/SOURCES/0006-src-fa.c-fa_dot_debug-check-result-of-fopen.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From dfbd54466e83b8c545da931db73f6c0ac73ae136 Mon Sep 17 00:00:00 2001
-From: Pino Toscano <ptoscano@redhat.com>
-Date: Thu, 19 Jul 2018 16:55:58 +0200
-Subject: [PATCH] * src/fa.c (fa_dot_debug): check result of fopen
-
-Return earlier if fopen fails, otherwise fa_dot will dereference a null
-pointer.
-
-(cherry picked from commit 2fd3692404cd4290f106bc6886e6cba949452fa0)
----
- src/fa.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/src/fa.c b/src/fa.c
-index 412d1394..8e1d7d47 100644
---- a/src/fa.c
-+++ b/src/fa.c
-@@ -286,6 +286,11 @@ static void fa_dot_debug(struct fa *fa, const char *tag) {
-         return;
- 
-     fp = fopen(fname, "w");
-+    if (fp == NULL) {
-+        free(fname);
-+        return;
-+    }
-+
-     fa_dot(fp, fa);
-     fclose(fp);
-     free(fname);
--- 
-2.17.2
-
diff --git a/SOURCES/0007-src-jmt.c-add_lens-fix-memory-leak-w-debugging.patch b/SOURCES/0007-src-jmt.c-add_lens-fix-memory-leak-w-debugging.patch
deleted file mode 100644
index ec5d997..0000000
--- a/SOURCES/0007-src-jmt.c-add_lens-fix-memory-leak-w-debugging.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From d2822e9faffdffc44ab6d8418c13b63a65e20338 Mon Sep 17 00:00:00 2001
-From: Pino Toscano <ptoscano@redhat.com>
-Date: Fri, 20 Jul 2018 14:08:50 +0200
-Subject: [PATCH] * src/jmt.c (add_lens): fix memory leak w/ debugging
-
-format_lens returns a new string every time, so save its result, and
-free it properly after use.
-
-(cherry picked from commit 4310fcc41c6f870da71d07423d6ac64ea6a60998)
----
- src/jmt.c | 10 +++++++---
- 1 file changed, 7 insertions(+), 3 deletions(-)
-
-diff --git a/src/jmt.c b/src/jmt.c
-index 79953da1..86179eed 100644
---- a/src/jmt.c
-+++ b/src/jmt.c
-@@ -1109,16 +1109,20 @@ static ind_t add_lens(struct jmt *jmt, struct lens *lens) {
- 
-     if (debugging("cf.jmt")) {
-         if (sA == NULL) {
-+            char *s = format_lens(lens);
-             printf("add_lens: ");
-             print_regexp(stdout, lens->ctype);
--            printf(" %s\n", format_lens(lens));
-+            printf(" %s\n", s);
-+            free(s);
-         } else {
-+            char *s = format_lens(lens);
-             printf("add_lens: ");
-             flens(stdout, l);
--            printf(" %u %s\n", sA->num, format_lens(lens));
-+            printf(" %u %s\n", sA->num, s);
-             if (nullable) {
--                printf("add_lens: // %s\n", format_lens(lens));
-+                printf("add_lens: // %s\n", s);
-             }
-+            free(s);
-         }
-     }
- 
--- 
-2.17.2
-
diff --git a/SOURCES/0008-src-pathx.c-parse_location_path-fix-memleak-on-error.patch b/SOURCES/0008-src-pathx.c-parse_location_path-fix-memleak-on-error.patch
deleted file mode 100644
index 3cea428..0000000
--- a/SOURCES/0008-src-pathx.c-parse_location_path-fix-memleak-on-error.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 095005bc98e28df6abcbb75dccfbbfa59d7b440d Mon Sep 17 00:00:00 2001
-From: Pino Toscano <ptoscano@redhat.com>
-Date: Fri, 20 Jul 2018 16:25:33 +0200
-Subject: [PATCH] * src/pathx.c (parse_location_path): fix memleak on error
-
-If parse_relative_location_path fails, then the early return will leak
-locpath.  Use the common error handling to cleanup all the resources.
-
-(cherry picked from commit b8dc554919827d70a6d24b054da463254164dca2)
----
- src/pathx.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/pathx.c b/src/pathx.c
-index 48c8b0b1..bd0fe2e3 100644
---- a/src/pathx.c
-+++ b/src/pathx.c
-@@ -1971,7 +1971,7 @@ static void parse_location_path(struct state *state) {
-             state->pos += 1;
-             locpath = parse_relative_location_path(state);
-             if (HAS_ERROR(state))
--                return;
-+                goto error;
-             struct step *step = make_step(DESCENDANT_OR_SELF, state);
-             if (HAS_ERROR(state))
-                 goto error;
--- 
-2.17.2
-
diff --git a/SOURCES/0009-src-syntax.c-interpreter_init-fix-memleak-on-load_mo.patch b/SOURCES/0009-src-syntax.c-interpreter_init-fix-memleak-on-load_mo.patch
deleted file mode 100644
index 35d65c2..0000000
--- a/SOURCES/0009-src-syntax.c-interpreter_init-fix-memleak-on-load_mo.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 7d296f655e21e0e6866e783c534fee4629bc7a38 Mon Sep 17 00:00:00 2001
-From: Pino Toscano <ptoscano@redhat.com>
-Date: Fri, 20 Jul 2018 16:30:26 +0200
-Subject: [PATCH] * src/syntax.c (interpreter_init): fix memleak on load_module
- fail
-
-If load_module fails, then name is not freed.  Instead, store the
-return value of load_module separately, cleanup name, and then check
-that value.
-
-(cherry picked from commit d5a6da8a8e302b8bf1fe35ae0bdd0433e522ddf2)
----
- src/syntax.c | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
-diff --git a/src/syntax.c b/src/syntax.c
-index d26babcc..f9f2849e 100644
---- a/src/syntax.c
-+++ b/src/syntax.c
-@@ -2060,6 +2060,7 @@ int interpreter_init(struct augeas *aug) {
- 
-     for (int i=0; i < globbuf.gl_pathc; i++) {
-         char *name, *p, *q;
-+        int res;
-         p = strrchr(globbuf.gl_pathv[i], SEP);
-         if (p == NULL)
-             p = globbuf.gl_pathv[i];
-@@ -2068,9 +2069,10 @@ int interpreter_init(struct augeas *aug) {
-         q = strchr(p, '.');
-         name = strndup(p, q - p);
-         name[0] = toupper(name[0]);
--        if (load_module(aug, name) == -1)
--            goto error;
-+        res = load_module(aug, name);
-         free(name);
-+        if (res == -1)
-+            goto error;
-     }
-     globfree(&globbuf);
-     return 0;
--- 
-2.17.2
-
diff --git a/SOURCES/0010-src-transform.c-transform_save-fix-leaks-on-fchmod-f.patch b/SOURCES/0010-src-transform.c-transform_save-fix-leaks-on-fchmod-f.patch
deleted file mode 100644
index eccbf2f..0000000
--- a/SOURCES/0010-src-transform.c-transform_save-fix-leaks-on-fchmod-f.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 93c4dc92dfbc5fbca8fbda96dc68172430b7095e Mon Sep 17 00:00:00 2001
-From: Pino Toscano <ptoscano@redhat.com>
-Date: Fri, 20 Jul 2018 16:32:44 +0200
-Subject: [PATCH] * src/transform.c (transform_save): fix leaks on fchmod fail
-
-If fchmod fails, the early return prevents any cleanup of the function
-resources, e.g. the open FILEs.  Use the common error handling instead.
-
-(cherry picked from commit 4d1a3f3cd8d97f852c6e7c50942255d535ad1405)
----
- src/transform.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/transform.c b/src/transform.c
-index 6a0ce858..176482b9 100644
---- a/src/transform.c
-+++ b/src/transform.c
-@@ -1258,7 +1258,7 @@ int transform_save(struct augeas *aug, struct tree *xfm,
- 
-         if (fchmod(fileno(fp), 0666 & ~curumsk) < 0) {
-             err_status = "create_chmod";
--            return -1;
-+            goto done;
-         }
-     }
- 
--- 
-2.17.2
-
diff --git a/SOURCES/0011-src-augparse.c-main-call-aug_close-even-on-failure.patch b/SOURCES/0011-src-augparse.c-main-call-aug_close-even-on-failure.patch
deleted file mode 100644
index e15144b..0000000
--- a/SOURCES/0011-src-augparse.c-main-call-aug_close-even-on-failure.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 7ae515ec6182fe2e4e834444eadefac0d4ac5fbd Mon Sep 17 00:00:00 2001
-From: Pino Toscano <ptoscano@redhat.com>
-Date: Fri, 20 Jul 2018 16:34:40 +0200
-Subject: [PATCH] * src/augparse.c (main): call aug_close even on failure
-
-Even if the resources will be freed at the exit, manually call aug_close
-to make sure that analyzers/checkers see only the real issues.
-
-(cherry picked from commit c1f99b22810526f674f38c4faee647bcf061e4e3)
----
- src/augparse.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/augparse.c b/src/augparse.c
-index 96a686c8..ad2342ac 100644
---- a/src/augparse.c
-+++ b/src/augparse.c
-@@ -140,6 +140,7 @@ int main(int argc, char **argv) {
-         if (s != NULL) {
-             fprintf(stderr, "%s\n", s);
-         }
-+        aug_close(aug);
-         exit(EXIT_FAILURE);
-     }
- 
--- 
-2.17.2
-
diff --git a/SOURCES/0012-Grub-tolerate-some-invalid-entries.patch b/SOURCES/0012-Grub-tolerate-some-invalid-entries.patch
deleted file mode 100644
index 2e4b880..0000000
--- a/SOURCES/0012-Grub-tolerate-some-invalid-entries.patch
+++ /dev/null
@@ -1,159 +0,0 @@
-From ae4e64c5bba611f6c1e2714aa834f365996f42f6 Mon Sep 17 00:00:00 2001
-From: David Lutterkort <lutter@watzmann.net>
-Date: Mon, 4 Jun 2018 10:45:19 -0700
-Subject: [PATCH] Grub: tolerate some invalid entries
-
-Refusing to parse an entire file because of invalid entries is too
-harsh. Try to make the behavior a little friendlier by simply mapping invalid
-entries to '#error' nodes but still parsing the rest of the file.
-
-Also remove del_to_eol, that would delete anything up to eol; it was only
-used in kw_pres, but should have never been used there. kw_pres should only
-match the keyword and eol. A line like 'quiet foo bar baz' should not be
-accepted by (kw_pres "quiet").
----
- lenses/grub.aug            | 58 ++++++++++++++++++++++++++++++++------
- lenses/tests/test_grub.aug | 25 ++++++++++++++++
- 2 files changed, 75 insertions(+), 8 deletions(-)
-
-diff --git a/lenses/grub.aug b/lenses/grub.aug
-index 06f9e79f..24ad39bc 100644
---- a/lenses/grub.aug
-+++ b/lenses/grub.aug
-@@ -29,9 +29,6 @@ module Grub =
-     (* View: eol *)
-     let eol = Util.eol
- 
--    (* View: del_to_eol *)
--    let del_to_eol = del /[^ \t\n]*/ ""
--
-     (* View: spc *)
-     let spc = Util.del_ws_spc
- 
-@@ -92,7 +89,22 @@ module Grub =
-       eol ]
- 
-     (* View: kw_pres *)
--    let kw_pres (kw:string) = [ opt_ws . key kw . del_to_eol . eol ]
-+    let kw_pres (kw:string) = [ opt_ws . key kw . eol ]
-+
-+    (* View: error
-+     *   Parse a line that looks almost like a valid setting, but isn't,
-+     *   into an '#error' node. Any line that starts with letters, but not
-+     *   anything matching kw, is considered an error line.
-+     *
-+     *   Parameters:
-+     *     kw:regexp - the valid keywords that are _not_ considered an
-+     *                 error
-+     *)
-+    let error (kw:regexp) =
-+      let not_kw = /[a-zA-Z]+/ - kw in
-+      [ label "#error" . Util.del_opt_ws "\t"
-+        . store (not_kw . /([^a-zA-Z\n].*[^ \t\n])?/) . eol ]
-+
- 
- (************************************************************************
-  * Group:                 BOOT ENTRIES
-@@ -138,8 +150,8 @@ module Grub =
-         spc . [ label "from" . store Rx.no_spaces ] )? .
-       eol ]
- 
--    (* View: menu_setting *)
--    let menu_setting = kw_menu_arg "default"
-+    (* View: menu_entry *)
-+    let menu_entry = kw_menu_arg "default"
-                      | kw_menu_arg "fallback"
-                      | kw_pres "hiddenmenu"
-                      | kw_menu_arg "timeout"
-@@ -156,6 +168,21 @@ module Grub =
-                      | device
-                      | setkey
- 
-+    (* View: menu_error
-+     *   Accept lines not matching menu_entry and stuff them into
-+     *   '#error' nodes
-+     *)
-+    let menu_error =
-+      let kw = /default|fallback|hiddenmenu|timeout|splashimage|gfxmenu/
-+             |/foreground|background|verbose|boot|password|title/
-+             |/serial|setkey|terminal|color|device/ in
-+      error kw
-+
-+    (* View: menu_setting
-+     *   a valid menu setting or a line that looks like one but is an #error
-+     *)
-+    let menu_setting = menu_entry | menu_error
-+
-     (* View: title *)
-     let title = del /title[ \t=]+/ "title " . value_to_eol . eol
- 
-@@ -206,9 +233,9 @@ module Grub =
-     let configfile =
-       [ command "configfile" "\t" . spc . store Rx.no_spaces . eol ]
- 
--    (* View: boot_setting
-+    (* View: boot_entry
-         <boot> entries *)
--    let boot_setting =
-+    let boot_entry =
-           let boot_arg_re = "root" | "initrd" | "rootnoverify" | "uuid"
-                           | "findroot" | "bootfs" (* Solaris extensions *)
-        in kw_boot_arg boot_arg_re
-@@ -223,6 +250,21 @@ module Grub =
-         | kw_pres "makeactive"
-         | password_arg
- 
-+    (* View: boot_error
-+     *   Accept lines not matching boot_entry and stuff them into
-+     *   '#error' nodes
-+     *)
-+    let boot_error =
-+      let kw = /lock|uuid|password|root|initrd|rootnoverify|findroot|bootfs/
-+             |/configfile|chainloader|title|boot|quiet|kernel|module/
-+             |/makeactive|savedefault|map/ in
-+      error kw
-+
-+    (* View: boot_setting
-+     *   a valid boot setting or a line that looks like one but is an #error
-+     *)
-+    let boot_setting = boot_entry | boot_error
-+
-     (* View: boot *)
-     let boot =
-       let line = ((boot_setting|comment)* . boot_setting)? in
-diff --git a/lenses/tests/test_grub.aug b/lenses/tests/test_grub.aug
-index 8a0d9f4a..75657203 100644
---- a/lenses/tests/test_grub.aug
-+++ b/lenses/tests/test_grub.aug
-@@ -257,3 +257,28 @@ password --encrypted ^9^32kwzzX./3WISQ0C /boot/grub/custom.lst
-     { "password" = "secret"
-       { "md5" }
-     } }
-+
-+  (* Test parsing of invalid entries via menu_error *)
-+  test Grub.lns get "default=0\ncrud=no\n" =
-+  { "default" = "0" }
-+  { "#error" = "crud=no" }
-+
-+  (* We handle some pretty bizarre bad syntax *)
-+  test Grub.lns get "default=0
-+crud no
-+valid:nope
-+nonsense  =   yes
-+bad arg1 arg2 arg3=v\n" =
-+  { "default" = "0" }
-+  { "#error" = "crud no" }
-+  { "#error" = "valid:nope" }
-+  { "#error" = "nonsense  =   yes" }
-+  { "#error" = "bad arg1 arg2 arg3=v" }
-+
-+  (* Test parsing of invalid entries via boot_error *)
-+  test Grub.lns get "title test
-+    root (hd0,0)
-+    crud foo\n" =
-+  { "title" = "test"
-+    { "root" = "(hd0,0)" }
-+    { "#error" = "crud foo" } }
--- 
-2.17.2
-
diff --git a/SOURCES/0013-Fix-sudoers-lens-always_query_group_plugin-588.patch b/SOURCES/0013-Fix-sudoers-lens-always_query_group_plugin-588.patch
deleted file mode 100644
index b7a9c5d..0000000
--- a/SOURCES/0013-Fix-sudoers-lens-always_query_group_plugin-588.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From 27b453cf1413be596175e676bc88a493959f5c4e Mon Sep 17 00:00:00 2001
-From: Steve Traylen <steve.traylen@cern.ch>
-Date: Thu, 1 Nov 2018 13:54:32 +0100
-Subject: [PATCH] Fix sudoers lens: "always_query_group_plugin" (#588)
-
-The option is now enabled by default in the default sudoers of
-RHEL 7.6 (and probably soon CentOS 7).
----
- lenses/sudoers.aug | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/lenses/sudoers.aug b/lenses/sudoers.aug
-index 11920d77..043c5636 100644
---- a/lenses/sudoers.aug
-+++ b/lenses/sudoers.aug
-@@ -316,6 +316,7 @@ let parameter_flag_kw    = "always_set_home" | "authenticate" | "env_editor"
-                          | "closefrom_override" | "compress_io" | "fast_glob"
-                          | "log_input" | "log_output" | "pwfeedback"
-                          | "umask_override" | "use_pty" | "match_group_by_gid"
-+                         | "always_query_group_plugin"
- 
- let parameter_flag       = [ del_negate . negate_node?
-                                . key parameter_flag_kw ]
--- 
-2.17.2
-
diff --git a/SOURCES/0014-Rsyslog-support-include-directive.patch b/SOURCES/0014-Rsyslog-support-include-directive.patch
deleted file mode 100644
index 3b11f2e..0000000
--- a/SOURCES/0014-Rsyslog-support-include-directive.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From a76a98b08de120f90a2c51fa43a86288ba6aebf8 Mon Sep 17 00:00:00 2001
-From: David Lutterkort <lutter@watzmann.net>
-Date: Wed, 13 Jun 2018 19:24:38 -0700
-Subject: [PATCH] Rsyslog: support include() directive
-
----
- lenses/rsyslog.aug            | 2 +-
- lenses/tests/test_rsyslog.aug | 6 ++++++
- 2 files changed, 7 insertions(+), 1 deletion(-)
-
-diff --git a/lenses/rsyslog.aug b/lenses/rsyslog.aug
-index 6648f3de..35f19a5b 100644
---- a/lenses/rsyslog.aug
-+++ b/lenses/rsyslog.aug
-@@ -33,7 +33,7 @@ let config_object_param = [ key /[A-Za-z.]+/ . Sep.equal . Quote.dquote
- let config_sep = del /[ \t]+|[ \t]*#.*\n[ \t]*/ " "
- 
- let config_object =
--  [ key /action|global|input|module|parser|timezone/ .
-+  [ key /action|global|input|module|parser|timezone|include/ .
-     Sep.lbracket .
-     config_object_param . ( config_sep . config_object_param )* .
-     Sep.rbracket . Util.comment_or_eol ]
-diff --git a/lenses/tests/test_rsyslog.aug b/lenses/tests/test_rsyslog.aug
-index b71d32c5..5386f836 100644
---- a/lenses/tests/test_rsyslog.aug
-+++ b/lenses/tests/test_rsyslog.aug
-@@ -199,3 +199,9 @@ test Rsyslog.lns get "module(load=\"imuxsock\" 	  # provides support for local s
-     { "SysSock.Use" = "off" }
-     { "#comment" = "Turn off message reception via local log socket;" } }
-   { "#comment" = "local messages are retrieved through imjournal now." }
-+
-+(* Added in rsyslog 8.33 *)
-+test Rsyslog.lns get "include(file=\"/etc/rsyslog.d/*.conf\" mode=\"optional\")\n" =
-+  { "include"
-+    { "file" = "/etc/rsyslog.d/*.conf" }
-+    { "mode" = "optional" } }
--- 
-2.17.2
-
diff --git a/SOURCES/0015-New-lens-Semanage-594.patch b/SOURCES/0015-New-lens-Semanage-594.patch
deleted file mode 100644
index f238e8c..0000000
--- a/SOURCES/0015-New-lens-Semanage-594.patch
+++ /dev/null
@@ -1,173 +0,0 @@
-From eafe62886f8941e249d8eceaee732d3b35e19616 Mon Sep 17 00:00:00 2001
-From: Pino Toscano <ptoscano@redhat.com>
-Date: Thu, 29 Nov 2018 11:22:28 +0100
-Subject: [PATCH] New lens: Semanage (#594)
-
-Introduce a new lens to parse /etc/selinux/semanage.conf instead of
-using Simplevars: the latter cannot handle the more complex syntax of
-groups introduced in newer versions of libsemanage.
----
- lenses/semanage.aug            | 37 ++++++++++++++++
- lenses/simplevars.aug          |  1 -
- lenses/tests/test_semanage.aug | 81 ++++++++++++++++++++++++++++++++++
- tests/Makefile.am              |  1 +
- 4 files changed, 119 insertions(+), 1 deletion(-)
- create mode 100644 lenses/semanage.aug
- create mode 100644 lenses/tests/test_semanage.aug
-
-diff --git a/lenses/semanage.aug b/lenses/semanage.aug
-new file mode 100644
-index 00000000..46f93b32
---- /dev/null
-+++ b/lenses/semanage.aug
-@@ -0,0 +1,37 @@
-+(*
-+Module: Semanage
-+   Parses /etc/selinux/semanage.conf
-+
-+Author:
-+   Pino Toscano <ptoscano@redhat.com>
-+
-+About: License
-+   This file is licenced under the LGPL v2+, like the rest of Augeas.
-+
-+About: Configuration files
-+   This lens applies to /etc/selinux/semanage.conf. See <filter>.
-+
-+About: Examples
-+   The <Test_Semanage> file contains various examples and tests.
-+*)
-+
-+module Semanage =
-+  autoload xfm
-+
-+let comment = IniFile.comment "#" "#"
-+let sep = IniFile.sep "=" "="
-+let empty = IniFile.empty
-+let eol = IniFile.eol
-+
-+let entry = IniFile.entry IniFile.entry_re sep comment
-+          | empty
-+
-+let title = IniFile.title_label "@group" (IniFile.record_re - /^end$/)
-+let record = [ title . entry+ . Util.del_str "[end]" . eol ]
-+
-+let lns = (entry | record)*
-+
-+(* Variable: filter *)
-+let filter = incl "/etc/selinux/semanage.conf"
-+
-+let xfm = transform lns filter
-diff --git a/lenses/simplevars.aug b/lenses/simplevars.aug
-index ad9795f0..6e6547cc 100644
---- a/lenses/simplevars.aug
-+++ b/lenses/simplevars.aug
-@@ -46,6 +46,5 @@ let filter = incl "/etc/kernel-img.conf"
-            . incl "/etc/audit/auditd.conf"
-            . incl "/etc/mixerctl.conf"
-            . incl "/etc/wsconsctlctl.conf"
--           . incl "/etc/selinux/semanage.conf"
- 
- let xfm = transform lns filter
-diff --git a/lenses/tests/test_semanage.aug b/lenses/tests/test_semanage.aug
-new file mode 100644
-index 00000000..a6ceaca0
---- /dev/null
-+++ b/lenses/tests/test_semanage.aug
-@@ -0,0 +1,81 @@
-+(*
-+Module: Test_Semanage
-+  Provides unit tests and examples for the <Semanage> lens.
-+*)
-+
-+module Test_Semanage =
-+
-+(* Variable: phony_conf *)
-+let phony_conf = "# this is a comment
-+
-+mykey = myvalue # eol comment
-+anotherkey = another value
-+"
-+
-+(* Test: Semanage.lns *)
-+test Semanage.lns get phony_conf =
-+   { "#comment" = "this is a comment" }
-+   { }
-+   { "mykey" = "myvalue"
-+     { "#comment" = "eol comment" } }
-+   { "anotherkey" = "another value" }
-+
-+(* Test: Semanage.lns
-+   Quotes are OK in variables that do not begin with a quote *)
-+test Semanage.lns get "UserParameter=custom.vfs.dev.read.ops[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$4}'\n" =
-+     { "UserParameter" = "custom.vfs.dev.read.ops[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$4}'" }
-+
-+(* Test: Semanage.lns
-+     Support empty values *)
-+test Semanage.lns get "foo =\n" =
-+  { "foo" }
-+
-+(* Variable: conf *)
-+let conf = "module-store = direct
-+module-store = \"source\"
-+
-+#policy-version = 19
-+
-+expand-check=0
-+
-+usepasswd=False
-+bzip-small=true
-+bzip-blocksize=5
-+ignoredirs=/root
-+
-+[sefcontext_compile]
-+path = /usr/sbin/sefcontext_compile
-+args = -r $@
-+
-+[end]
-+
-+config=test
-+
-+[verify module]
-+test=value
-+[end]
-+"
-+
-+(* Test: Semanage.lns *)
-+test Semanage.lns get conf =
-+   { "module-store" = "direct" }
-+   { "module-store" = "source" }
-+   { }
-+   { "#comment" = "policy-version = 19" }
-+   { }
-+   { "expand-check" = "0" }
-+   { }
-+   { "usepasswd" = "False" }
-+   { "bzip-small" = "true" }
-+   { "bzip-blocksize" = "5" }
-+   { "ignoredirs" = "/root" }
-+   { }
-+   { "@group" = "sefcontext_compile"
-+     { "path" = "/usr/sbin/sefcontext_compile" }
-+     { "args" = "-r $@" }
-+     { } }
-+   { }
-+   { "config" = "test" }
-+   { }
-+   { "@group" = "verify module"
-+     { "test" = "value" } }
-diff --git a/tests/Makefile.am b/tests/Makefile.am
-index 8e035e91..2b87c1c7 100644
---- a/tests/Makefile.am
-+++ b/tests/Makefile.am
-@@ -186,6 +186,7 @@ lens_tests =			\
-   lens-rx.sh			\
-   lens-samba.sh			\
-   lens-securetty.sh     \
-+  lens-semanage.sh		\
-   lens-services.sh		\
-   lens-shadow.sh		\
-   lens-shells.sh		\
--- 
-2.17.2
-
diff --git a/SOURCES/0016-New-lens-Anaconda-597.patch b/SOURCES/0016-New-lens-Anaconda-597.patch
deleted file mode 100644
index 24bd8d4..0000000
--- a/SOURCES/0016-New-lens-Anaconda-597.patch
+++ /dev/null
@@ -1,186 +0,0 @@
-From affbc1187de0ca5f9c0cc23ba75da7b8d09402e4 Mon Sep 17 00:00:00 2001
-From: Pino Toscano <ptoscano@redhat.com>
-Date: Wed, 12 Dec 2018 13:54:06 +0100
-Subject: [PATCH] New lens: Anaconda (#597)
-
-Introduce a new lens to parse the INI-like `/etc/sysconfig/anaconda` instead of using `Shellvars`.
----
- lenses/anaconda.aug               | 30 +++++++++++
- lenses/shellvars.aug              |  1 +
- lenses/tests/test_anaconda.aug    | 89 +++++++++++++++++++++++++++++++
- tests/Makefile.am                 |  1 +
- tests/root/etc/sysconfig/anaconda |  5 ++
- 5 files changed, 126 insertions(+)
- create mode 100644 lenses/anaconda.aug
- create mode 100644 lenses/tests/test_anaconda.aug
- create mode 100644 tests/root/etc/sysconfig/anaconda
-
-diff --git a/lenses/anaconda.aug b/lenses/anaconda.aug
-new file mode 100644
-index 00000000..8f618db2
---- /dev/null
-+++ b/lenses/anaconda.aug
-@@ -0,0 +1,30 @@
-+(*
-+Module: Anaconda
-+    Parses Anaconda's user interaction configuration files.
-+
-+Author: Pino Toscano <ptoscano@redhat.com>
-+
-+About: Reference
-+    https://anaconda-installer.readthedocs.io/en/latest/user-interaction-config-file-spec.html
-+
-+About: Configuration file
-+    This lens applies to /etc/sysconfig/anaconda.
-+
-+About: License
-+  This file is licensed under the LGPL v2+, like the rest of Augeas.
-+*)
-+module Anaconda =
-+autoload xfm
-+
-+let comment = IniFile.comment "#" "#"
-+let sep     = IniFile.sep "=" "="
-+
-+let entry   = IniFile.entry IniFile.entry_re sep comment
-+let title   = IniFile.title IniFile.record_re
-+let record  = IniFile.record title entry
-+
-+let lns     = IniFile.lns record comment
-+
-+let filter  = incl "/etc/sysconfig/anaconda"
-+
-+let xfm     = transform lns filter
-diff --git a/lenses/shellvars.aug b/lenses/shellvars.aug
-index c92d56ea..467e9643 100644
---- a/lenses/shellvars.aug
-+++ b/lenses/shellvars.aug
-@@ -252,6 +252,7 @@ module Shellvars =
- 
-   let filter_sysconfig =
-       sc_incl "*" .
-+      sc_excl "anaconda" .
-       sc_excl "bootloader" .
-       sc_excl "hw-uuid" .
-       sc_excl "hwconf" .
-diff --git a/lenses/tests/test_anaconda.aug b/lenses/tests/test_anaconda.aug
-new file mode 100644
-index 00000000..50b0ac22
---- /dev/null
-+++ b/lenses/tests/test_anaconda.aug
-@@ -0,0 +1,89 @@
-+(*
-+Module: Test_Anaconda
-+  Provides unit tests and examples for the <Anaconda> lens.
-+
-+  - 'exampleN' snippets are taken from the documentation:
-+    https://anaconda-installer.readthedocs.io/en/latest/user-interaction-config-file-spec.html
-+  - 'installedN' snippets are taken from the resulting files after
-+    a successful installation
-+*)
-+
-+module Test_Anaconda =
-+
-+let example1 = "# comment example - before the section headers
-+
-+[section_1]
-+# comment example - inside section 1
-+key_a_in_section1=some_value
-+key_b_in_section1=some_value
-+
-+[section_2]
-+# comment example - inside section 2
-+key_a_in_section2=some_value
-+"
-+
-+test Anaconda.lns get example1 =
-+  { "#comment" = "comment example - before the section headers" }
-+  { }
-+  { "section_1"
-+    { "#comment" = "comment example - inside section 1" }
-+    { "key_a_in_section1" = "some_value" }
-+    { "key_b_in_section1" = "some_value" }
-+    { }
-+  }
-+  { "section_2"
-+    { "#comment" = "comment example - inside section 2" }
-+    { "key_a_in_section2" = "some_value" }
-+  }
-+
-+let example2 = "# this is the user interaction config file
-+
-+[General]
-+post_install_tools_disabled=0
-+
-+[DatetimeSpoke]
-+# the date and time spoke has been visited
-+visited=1
-+changed_timezone=1
-+changed_ntp=0
-+changed_timedate=1
-+
-+[KeyboardSpoke]
-+# the keyboard spoke has not been visited
-+visited=0
-+"
-+
-+test Anaconda.lns get example2 =
-+  { "#comment" = "this is the user interaction config file" }
-+  { }
-+  { "General"
-+    { "post_install_tools_disabled" = "0" }
-+    { }
-+  }
-+  { "DatetimeSpoke"
-+    { "#comment" = "the date and time spoke has been visited" }
-+    { "visited" = "1" }
-+    { "changed_timezone" = "1" }
-+    { "changed_ntp" = "0" }
-+    { "changed_timedate" = "1" }
-+    { }
-+  }
-+  { "KeyboardSpoke"
-+    { "#comment" = "the keyboard spoke has not been visited" }
-+    { "visited" = "0" }
-+  }
-+
-+let installed1 = "# This file has been generated by the Anaconda Installer 21.48.22.134-1
-+
-+[ProgressSpoke]
-+visited = 1
-+
-+"
-+
-+test Anaconda.lns get installed1 =
-+  { "#comment" = "This file has been generated by the Anaconda Installer 21.48.22.134-1" }
-+  { }
-+  { "ProgressSpoke"
-+    { "visited" = "1" }
-+    { }
-+  }
-diff --git a/tests/Makefile.am b/tests/Makefile.am
-index 2b87c1c7..7aa1f14c 100644
---- a/tests/Makefile.am
-+++ b/tests/Makefile.am
-@@ -22,6 +22,7 @@ lens_tests =			\
-   lens-activemq_xml.sh		\
-   lens-afs_cellalias.sh			\
-   lens-aliases.sh		\
-+  lens-anaconda.sh		\
-   lens-anacron.sh		\
-   lens-approx.sh		\
-   lens-apt_update_manager.sh		\
-diff --git a/tests/root/etc/sysconfig/anaconda b/tests/root/etc/sysconfig/anaconda
-new file mode 100644
-index 00000000..73318cf6
---- /dev/null
-+++ b/tests/root/etc/sysconfig/anaconda
-@@ -0,0 +1,5 @@
-+# This file has been generated by the Anaconda Installer 21.48.22.134-1
-+
-+[ProgressSpoke]
-+visited = 1
-+
--- 
-2.17.2
-
diff --git a/SPECS/augeas.spec b/SPECS/augeas.spec
index de65c90..c3bcd1a 100644
--- a/SPECS/augeas.spec
+++ b/SPECS/augeas.spec
@@ -1,28 +1,12 @@
 Name:           augeas
-Version:        1.10.1
-Release:        8%{?dist}
+Version:        1.12.0
+Release:        2%{?dist}
 Summary:        A library for changing configuration files
 
 Group:          System Environment/Libraries
 License:        LGPLv2+
 URL:            http://augeas.net/
 Source0:        http://download.augeas.net/%{name}-%{version}.tar.gz
-Patch1:         0001-Fix-several-memory-leak-in-augmatch.patch
-Patch2:         0002-Use-a-safer-calling-convention-for-native-functions.patch
-Patch3:         0003-src-augeas.c-aug_source-actually-return-the-source-f.patch
-Patch4:         0004-tests-test-api.c-add-a-check-for-aug_source.patch
-Patch5:         0005-src-augtool.c-fix-access-to-invalid-memory.patch
-Patch6:         0006-src-fa.c-fa_dot_debug-check-result-of-fopen.patch
-Patch7:         0007-src-jmt.c-add_lens-fix-memory-leak-w-debugging.patch
-Patch8:         0008-src-pathx.c-parse_location_path-fix-memleak-on-error.patch
-Patch9:         0009-src-syntax.c-interpreter_init-fix-memleak-on-load_mo.patch
-Patch10:        0010-src-transform.c-transform_save-fix-leaks-on-fchmod-f.patch
-Patch11:        0011-src-augparse.c-main-call-aug_close-even-on-failure.patch
-Patch12:        0012-Grub-tolerate-some-invalid-entries.patch
-Patch13:        0013-Fix-sudoers-lens-always_query_group_plugin-588.patch
-Patch14:        0014-Rsyslog-support-include-directive.patch
-Patch15:        0015-New-lens-Semanage-594.patch
-Patch16:        0016-New-lens-Anaconda-597.patch
 
 BuildRequires:  readline-devel libselinux-devel libxml2-devel
 BuildRequires:  autoconf, automake
@@ -63,46 +47,17 @@ configuration files into a tree structure, which it exposes through its
 public API. Changes made through the API are written back to the initially
 read files.
 
-%package        static
-Summary:        Static libraries for %{name}
-Group:          Development/Libraries
-Requires:       %{name}-devel = %{version}-%{release}
-
-%description    static
-The %{name}-static package contains static libraries needed to produce
-static builds using %{name}.
-
 
 
 %prep
 %setup -q
-%patch1 -p1
-%patch2 -p1
-%patch3 -p1
-%patch4 -p1
-%patch5 -p1
-%patch6 -p1
-%patch7 -p1
-%patch8 -p1
-%patch9 -p1
-%patch10 -p1
-%patch11 -p1
-%patch12 -p1
-%patch13 -p1
-%patch14 -p1
-%patch15 -p1
-%patch16 -p1
-
-# Patches affect Makefile.am and configure.ac, so rerun autotools.
-autoreconf
-autoconf
 
 %build
 %configure \
 %ifarch riscv64
     --disable-gnulib-tests \
 %endif
-    --enable-static
+    --disable-static
 make V=1 %{?_smp_mflags}
 
 %check
@@ -125,9 +80,6 @@ find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';'
 # so it shouldn't be packaged.
 rm -r $RPM_BUILD_ROOT%{_datadir}/augeas/lenses/dist/tests
 
-# In 1.9.0, the example /usr/bin/dump gets installed inadvertently
-rm -f $RPM_BUILD_ROOT/usr/bin/dump
-
 %clean
 rm -rf $RPM_BUILD_ROOT
 
@@ -160,12 +112,14 @@ rm -rf $RPM_BUILD_ROOT
 %{_libdir}/*.so
 %{_libdir}/pkgconfig/augeas.pc
 
-%files static
-%defattr(-,root,root,-)
-%{_libdir}/libaugeas.a
-%{_libdir}/libfa.a
-
 %changelog
+* Mon Jun 03 2019 Pino Toscano <ptoscano@redhat.com> - 1.12.0-2
+- Disable static libraries, not needed in RHEL.
+
+* Tue May 14 2019 Pino Toscano <ptoscano@redhat.com> - 1.12.0-1
+- New upstream release (RHBZ#1709416)
+  * Fstab: allow leading whitespaces (RHBZ#1671950)
+
 * Thu Dec 13 2018 Pino Toscano <ptoscano@redhat.com> - 1.10.1-8
 - Add simple tests (RHBZ#1653994)