t* sacc + cursorline and uri preview
       
   URI git clone git://git.codevoid.de/sacc-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR LICENSE
       ---
   DIR commit 74347a93e3ab3f90c310b2f4d457fb9717401c65
   DIR parent d03c161c2aa47bf254336a7098caf428a4d58134
   URI Author: Quentin Rameau <quinq@fifth.space>
       Date:   Wed, 26 Jul 2017 16:37:51 +0200
       
       Plumb items on explicit plumb or first download
       
       Diffstat:
         M sacc.c                              |      59 ++++++++++++++++++-------------
       
       1 file changed, 35 insertions(+), 24 deletions(-)
       ---
   DIR diff --git a/sacc.c b/sacc.c
       t@@ -481,45 +481,56 @@ plumb(char *url)
        static void
        plumbitem(Item *item)
        {
       -        char *file, *path;
       +        char *file, *path, *tag;
                mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP;
                int dest;
        
       -        if (!item->tag) {
       -                if (file = strrchr(item->selector, '/'))
       -                        ++file;
       -                else
       -                        file = item->selector;
       +        if (file = strrchr(item->selector, '/'))
       +                ++file;
       +        else
       +                file = item->selector;
        
       -                path = uiprompt("Download %s to (^D cancel, <empty> plumb): ",
       -                                file);
       -                if (!path)
       -                        return;
       -                if (path[1]) {
       -                        path[strlen(path)-1] = '\0';
       -                        dest = open(path, O_WRONLY|O_CREAT|O_EXCL, mode);
       -                        if (dest < 0) {
       -                                printf("Can't open destination file %s: %s\n",
       -                                       path, strerror(errno));
       -                                errno = 0;
       -                                goto cleanup;
       -                        }
       -                } else {
       +        path = uiprompt("Download %s to (^D cancel, <empty> plumb): ",
       +                        file);
       +        if (!path)
       +                return;
       +
       +        if ((tag = item->tag) && access(tag, R_OK) < 0) {
       +                clear(&item->tag);
       +                tag = NULL;
       +        }
       +
       +        if (path[1]) {
       +                path[strlen(path)-1] = '\0';
       +
       +                if (tag && !strcmp(tag, path))
       +                        goto cleanup;
       +
       +                if ((dest = open(path, O_WRONLY|O_CREAT|O_EXCL, mode)) < 0) {
       +                        printf("Can't open destination file %s: %s\n",
       +                               path, strerror(errno));
       +                        errno = 0;
       +                        goto cleanup;
       +                }
       +        } else {
       +                clear(&path);
       +
       +                if (!tag) {
                                path = xstrdup("/tmp/sacc/img-XXXXXX");
        
                                if ((dest = mkstemp(path)) < 0)
                                        die("mkstemp: %s: %s", path, strerror(errno));
                        }
       +        }
        
       -                if (!download(item, dest))
       -                        goto cleanup;
       +        if (path && (!download(item, dest) || tag))
       +                goto cleanup;
        
       +        if (!tag)
                        item->tag = path;
       -        }
        
                plumb(item->tag);
                return;
       -
        cleanup:
                free(path);
                return;