~ruther/guix-local

f9aefa2d5fb3f6aad25a907939ee872c828b33d0 — Ludovic Courtès 9 years ago 94d92c7
daemon: Add 'built-in-builders' RPC.

* nix/libstore/builtins.cc (builtinBuilderNames): New function.
* nix/libstore/builtins.hh (builtinBuilderNames): New declaration.
* nix/libstore/worker-protocol.hh (PROTOCOL_VERSION): Bump to 0x160.
(WorkerOp)[wopBuiltinBuilders]: New value.
* nix/nix-daemon/nix-daemon.cc (performOp): Handle it.
* guix/store.scm (operation-id)[built-in-builders]: New value.
* guix/store.scm (read-arg): Add 'string-list'.
(built-in-builders): New procedure.
* tests/derivations.scm ("built-in-builders"): New test.
M guix/store.scm => guix/store.scm +23 -2
@@ 95,6 95,7 @@
            path-info-registration-time
            path-info-nar-size

            built-in-builders
            references
            references/substitutes
            requisites


@@ 187,7 188,8 @@
  (query-substitutable-paths 32)
  (query-valid-derivers 33)
  (optimize-store 34)
  (verify-store 35))
  (verify-store 35)
  (built-in-builders 80))

(define-enumerate-type hash-algo
  ;; hash.hh


@@ 283,7 285,7 @@
     (write-string (bytevector->base16-string arg) p))))

(define-syntax read-arg
  (syntax-rules (integer boolean string store-path store-path-list
  (syntax-rules (integer boolean string store-path store-path-list string-list
                 substitutable-path-list path-info base16)
    ((_ integer p)
     (read-int p))


@@ 295,6 297,8 @@
     (read-store-path p))
    ((_ store-path-list p)
     (read-store-path-list p))
    ((_ string-list p)
     (read-string-list p))
    ((_ substitutable-path-list p)
     (read-substitutable-path-list p))
    ((_ path-info p)


@@ 914,6 918,23 @@ that there is no guarantee that the order of the resulting list matches the
order of PATHS."
             substitutable-path-list))

(define built-in-builders
  (let ((builders (operation (built-in-builders)
                             "Return the built-in builders."
                             string-list)))
    (lambda (store)
      "Return the names of the supported built-in derivation builders
supported by STORE."
      ;; Check whether STORE's version supports this RPC and built-in
      ;; derivation builders in general, which appeared in Guix > 0.11.0.
      ;; Return the empty list if it doesn't.  Note that this RPC does not
      ;; exist in 'nix-daemon'.
      (if (or (> (nix-server-major-version store) #x100)
              (and (= (nix-server-major-version store) #x100)
                   (>= (nix-server-minor-version store) #x60)))
          (builders store)
          '()))))

(define-operation (optimize-store)
  "Optimize the store by hard-linking identical files (\"deduplication\".)
Return #t on success."

M nix/libstore/builtins.cc => nix/libstore/builtins.cc +10 -0
@@ 66,4 66,14 @@ derivationBuilder lookupBuiltinBuilder(const std::string & name)
	return NULL;
}

std::list<std::string> builtinBuilderNames()
{
    std::list<std::string> result;
    for(auto&& iter: builtins)
    {
	result.push_back(iter.first);
    }
    return result;
}

}

M nix/libstore/builtins.hh => nix/libstore/builtins.hh +3 -0
@@ 38,4 38,7 @@ namespace nix {
    /* Return the built-in builder called BUILDER, or NULL if none was
       found.  */
    derivationBuilder lookupBuiltinBuilder(const std::string &builder);

    /* Return the list of supported built-in builder names.  */
    std::list<std::string> builtinBuilderNames();
}

M nix/libstore/worker-protocol.hh => nix/libstore/worker-protocol.hh +3 -2
@@ 6,7 6,7 @@ namespace nix {
#define WORKER_MAGIC_1 0x6e697863
#define WORKER_MAGIC_2 0x6478696f

#define PROTOCOL_VERSION 0x10f
#define PROTOCOL_VERSION 0x160
#define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00)
#define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff)



@@ 43,7 43,8 @@ typedef enum {
    wopQuerySubstitutablePaths = 32,
    wopQueryValidDerivers = 33,
    wopOptimiseStore = 34,
    wopVerifyStore = 35
    wopVerifyStore = 35,
    wopBuiltinBuilders = 80
} WorkerOp;



M nix/nix-daemon/nix-daemon.cc => nix/nix-daemon/nix-daemon.cc +9 -0
@@ 6,6 6,7 @@
#include "archive.hh"
#include "affinity.hh"
#include "globals.hh"
#include "builtins.hh"

#include <algorithm>



@@ 671,6 672,14 @@ static void performOp(bool trusted, unsigned int clientVersion,
        break;
    }

    case wopBuiltinBuilders: {
	startWork();
	auto names = builtinBuilderNames();
	stopWork();
	writeStrings(names, to);
	break;
    }

    default:
        throw Error(format("invalid operation %1%") % op);
    }

M tests/derivations.scm => tests/derivations.scm +4 -0
@@ 211,6 211,10 @@
                (= (stat:ino (lstat file1))
                   (stat:ino (lstat file2))))))))

(test-equal "built-in-builders"
  '("download")
  (built-in-builders %store))

(test-assert "unknown built-in builder"
  (let ((drv (derivation %store "ohoh" "builtin:does-not-exist" '())))
    (guard (c ((nix-protocol-error? c)