Hi,

I started to work on a cargo.port.mk module, to help building ports
based on cargo/rust ecosystem.

The following diff adds:
  - devel/cargo/cargo.port.mk: the module
  - devel/cargo/files/modcargo-make-makesum: a configure helper
    (generate metadata required by cargo for all crates)

It also changes devel/cargo itself to use the module. But due to cargo
nature, it isn't a good model for the module use...

A port will use MODCARGO_CRATES entries for declaring crates.

The module will:
  - adds DISTFILES and using MASTER_SITES9 for downloading files
  - at pre-configure stage:
    - creating a cargo configuration file to override standard registry
      (which requires network access) to a local directory at
      ${WRKSRC}/modcargo-crates

    - moving all extracted crates inside the directory
    - generating metadata for each crate (using a script helper):
      basically a json file with sha256 of all files and sha256 of the
      tgz.
  - calling cargo binary with right parameters for build, install, test
    (behaviour overridable).

I also added two custom targets (prefixed with modcargo-) to help
generating MODCARGO_CRATES entries.


Regarding devel/Cargo itself, I am now facing a problem: the make test
doesn't work well anymore (lot of tests are failing due to overriding of
package registry with a local directory). So I added a non-standard
target (test-full) which remove the cargo configuration file installed
by pre-configure, and as result it makes cargo to run and use the
network for building and testing the testsuite... I dunno if it is
acceptable or not. The standard "test" target still use no network, but
isn't able to run the whole testsuite.

Thanks for your feedback regarding the module.
-- 
Sebastien Marie

Index: Makefile
===================================================================
RCS file: /cvs/ports/devel/cargo/Makefile,v
retrieving revision 1.6
diff -u -p -r1.6 Makefile
--- Makefile    13 Nov 2016 08:59:26 -0000      1.6
+++ Makefile    13 Nov 2016 14:51:04 -0000
@@ -4,20 +4,12 @@ COMMENT = package manager for Rust langu
 # cargo version
 CARGO_VERSION =                0.14.0
 
-# rust-install submodule version in cargo/src/rust-installer
-# see https://github.com/rust-lang/cargo/tree/${CARGO_VERSION}/src
-RUSTINSTALL_INDEX =    4f994850808a572e2cc8d43f968893c8e942e9bf
-
-# crates.io commit for CARGO_VERSION
-# see https://github.com/rust-lang/crates.io-index/commits/master/ca/rg/cargo
-CRATESIO_INDEX =       9f8c3a65f70b2a5723e0d9cc0a32d531ea42da67
-
 # cargo version used for bootstrapping
 BOOTSTRAP_VERSION =    0.14.0-20161112
 
-# registry index
-# see ${WRKDIR}/cargo-home/registry/index/github.com-${REGISTRY_INDEX}
-REGISTRY_INDEX =       1ecc6299db9ec823
+# rust-install submodule version in cargo/src/rust-installer
+# see https://github.com/rust-lang/cargo/tree/${CARGO_VERSION}/src
+RUSTINSTALL_INDEX =    4f994850808a572e2cc8d43f968893c8e942e9bf
 
 
 DISTNAME =     cargo-${CARGO_VERSION}
@@ -32,96 +24,100 @@ MAINTAINER =       Sebastien Marie <semarie@on
 #  - MIT
 #  - Unlicense/MIT
 #  - MIT/Apache-2.0
+#  - MPL-2.0
 #
 PERMIT_PACKAGE_CDROM = Yes
 
 WANTLIB = c crypto curl m pthread ssh2 ssl z
 
-DIST_SUBDIR =  cargo
 MASTER_SITES = https://github.com/rust-lang/
 DISTFILES +=   
cargo-${CARGO_VERSION}.tar.gz{cargo/archive/${CARGO_VERSION}.tar.gz}
 DISTFILES +=   
rust-installer-${RUSTINSTALL_INDEX}.tar.gz{rust-installer/archive/${RUSTINSTALL_INDEX}.tar.gz}
-DISTFILES +=   
crates.io-index-${CRATESIO_INDEX}.tar.gz{crates.io-index/archive/${CRATESIO_INDEX}.tar.gz}
-
-# look at ${WRKDIR}/cargo-home/registry/src/github.com-${REGISTRY_INDEX}
-# for the list
-CRATES +=      advapi32-sys-0.2.0              # MIT
-CRATES +=      aho-corasick-0.5.3              # Unlicense/MIT
-CRATES +=      bitflags-0.1.1                  # MIT/Apache-2.0
-CRATES +=      bitflags-0.7.0                  # MIT/Apache-2.0
-CRATES +=      bufstream-0.1.2                 # MIT/Apache-2.0 (test)
-CRATES +=      cfg-if-0.1.0                    # MIT/Apache-2.0
-CRATES +=      cmake-0.1.17                    # MIT/Apache-2.0
-CRATES +=      crossbeam-0.2.9                 # MIT/Apache-2.0
-CRATES +=      curl-0.3.9                      # MIT
-CRATES +=      curl-sys-0.2.4                  # MIT
-CRATES +=      docopt-0.6.82                   # Unlicense/MIT
-CRATES +=      env_logger-0.3.4                # MIT/Apache-2.0
-CRATES +=      filetime-0.1.10                 # MIT/Apache-2.0
-CRATES +=      flate2-0.2.14                   # MIT/Apache-2.0
-CRATES +=      fs2-0.2.5                       # MIT/Apache-2.0
-CRATES +=      gcc-0.3.35                      # MIT/Apache-2.0
-CRATES +=      git2-0.4.4                      # MIT/Apache-2.0
-CRATES +=      git2-curl-0.5.0                 # MIT/Apache-2.0
-CRATES +=      glob-0.2.11                     # MIT/Apache-2.0
-CRATES +=      hamcrest-0.1.1                  # MIT/Apache-2.0 (test)
-CRATES +=      idna-0.1.0                      # MIT/Apache-2.0
-CRATES +=      kernel32-sys-0.2.2              # MIT
-CRATES +=      lazy_static-0.2.1               # MIT
-CRATES +=      libc-0.2.17                     # MIT/Apache-2.0
-CRATES +=      libgit2-sys-0.4.5               # MIT/Apache-2.0
-CRATES +=      libssh2-sys-0.1.39              # MIT/Apache-2.0
-CRATES +=      libz-sys-1.0.6                  # MIT/Apache-2.0
-CRATES +=      log-0.3.6                       # MIT/Apache-2.0
-CRATES +=      matches-0.1.2                   # MIT
-CRATES +=      memchr-0.1.11                   # Unlicense/MIT
-CRATES +=      miniz-sys-0.1.7                 # MIT/Apache-2.0
-CRATES +=      miow-0.1.3                      # MIT/Apache-2.0
-CRATES +=      net2-0.2.26                     # MIT/Apache-2.0
-CRATES +=      num-0.1.36                      # MIT/Apache-2.0 (test)
-CRATES +=      num-bigint-0.1.35               # MIT/Apache-2.0 (test)
-CRATES +=      num-complex-0.1.35              # MIT/Apache-2.0 (test)
-CRATES +=      num-integer-0.1.32              # MIT/Apache-2.0 (test)
-CRATES +=      num-iter-0.1.32                 # MIT/Apache-2.0 (test)
-CRATES +=      num-rational-0.1.35             # MIT/Apache-2.0 (test)
-CRATES +=      num-traits-0.1.36               # MIT/Apache-2.0 (test)
-CRATES +=      num_cpus-1.0.0                  # MIT
-CRATES +=      openssl-0.7.14                  # Apache-2.0
-CRATES +=      openssl-sys-0.7.14              # MIT
-CRATES +=      openssl-sys-extras-0.7.14       # MIT
-CRATES +=      pkg-config-0.3.8                # MIT/Apache-2.0
-CRATES +=      psapi-sys-0.1.0                 # MIT
-CRATES +=      rand-0.3.14                     # MIT/Apache-2.0
-CRATES +=      regex-0.1.77                    # MIT/Apache-2.0
-CRATES +=      regex-syntax-0.3.5              # MIT/Apache-2.0
-CRATES +=      rustc-serialize-0.3.19          # MIT/Apache-2.0
-CRATES +=      semver-0.5.1                    # MIT/Apache-2.0
-CRATES +=      semver-parser-0.6.1             # MIT/Apache-2.0
-CRATES +=      strsim-0.3.0                    # MIT
-CRATES +=      tar-0.4.8                       # MIT/Apache-2.0
-CRATES +=      tempdir-0.3.5                   # MIT/Apache-2.0
-CRATES +=      term-0.4.4                      # MIT/Apache-2.0
-CRATES +=      thread-id-2.0.0                 # Apache-2.0
-CRATES +=      thread_local-0.2.6              # Apache-2.0/MIT
-CRATES +=      toml-0.2.0                      # MIT/Apache-2.0
-CRATES +=      unicode-bidi-0.2.3              # MIT/Apache-2.0
-CRATES +=      unicode-normalization-0.1.2     # MIT/Apache-2.0
-CRATES +=      url-1.2.0                       # MIT/Apache-2.0
-CRATES +=      utf8-ranges-0.1.3               # Unlicense/MIT
-CRATES +=      winapi-0.2.8                    # MIT
-CRATES +=      winapi-build-0.1.1              # MIT
-CRATES +=      ws2_32-sys-0.2.1                # MIT
-
-MASTER_SITES0 =        https://crates.io/api/v1/crates/
-.for _crate in ${CRATES}
-DISTFILES +=   
${_crate}.tar.gz{${_crate:C/-[^-]*$//}/${_crate:C/^.*-//}/download}:0
-.endfor
 
-MASTER_SITES1 = http://kapouay.odns.fr/pub/cargo/
-DISTFILES +=   cargo-bootstrap-${BOOTSTRAP_VERSION}.tar.gz:1
+MODCARGO_CRATES +=     advapi32-sys-0.2.0      # MIT
+MODCARGO_CRATES +=     aho-corasick-0.5.3      # Unlicense/MIT
+MODCARGO_CRATES +=     bitflags-0.1.1          # MIT/Apache-2.0
+MODCARGO_CRATES +=     bitflags-0.7.0          # MIT/Apache-2.0
+MODCARGO_CRATES +=     bufstream-0.1.2         # MIT/Apache-2.0
+MODCARGO_CRATES +=     cfg-if-0.1.0            # MIT/Apache-2.0
+MODCARGO_CRATES +=     cmake-0.1.17            # MIT/Apache-2.0
+MODCARGO_CRATES +=     crossbeam-0.2.9         # Apache-2.0/MIT
+MODCARGO_CRATES +=     curl-0.3.9              # MIT
+MODCARGO_CRATES +=     curl-sys-0.2.4          # MIT
+MODCARGO_CRATES +=     docopt-0.6.82           # Unlicense/MIT
+MODCARGO_CRATES +=     env_logger-0.3.4        # MIT/Apache-2.0
+MODCARGO_CRATES +=     filetime-0.1.10         # MIT/Apache-2.0
+MODCARGO_CRATES +=     flate2-0.2.14           # MIT/Apache-2.0
+MODCARGO_CRATES +=     fs2-0.2.5               # MIT/Apache-2.0
+MODCARGO_CRATES +=     gcc-0.3.35              # MIT/Apache-2.0
+MODCARGO_CRATES +=     gdi32-sys-0.2.0         # MIT
+MODCARGO_CRATES +=     git2-0.4.4              # MIT/Apache-2.0
+MODCARGO_CRATES +=     git2-curl-0.5.0         # MIT/Apache-2.0
+MODCARGO_CRATES +=     glob-0.2.11             # MIT/Apache-2.0
+MODCARGO_CRATES +=     hamcrest-0.1.1          # MIT/Apache-2.0
+MODCARGO_CRATES +=     idna-0.1.0              # MIT/Apache-2.0
+MODCARGO_CRATES +=     kernel32-sys-0.2.2      # MIT
+MODCARGO_CRATES +=     lazy_static-0.2.1       # MIT
+MODCARGO_CRATES +=     libc-0.2.17             # MIT/Apache-2.0
+MODCARGO_CRATES +=     libgit2-sys-0.4.5       # MIT/Apache-2.0
+MODCARGO_CRATES +=     libressl-pnacl-sys-2.1.6 # MIT
+MODCARGO_CRATES +=     libssh2-sys-0.1.39      # MIT/Apache-2.0
+MODCARGO_CRATES +=     libz-sys-1.0.6          # MIT/Apache-2.0
+MODCARGO_CRATES +=     log-0.3.6               # MIT/Apache-2.0
+MODCARGO_CRATES +=     matches-0.1.2           # MIT
+MODCARGO_CRATES +=     memchr-0.1.11           # Unlicense/MIT
+MODCARGO_CRATES +=     miniz-sys-0.1.7         # MIT/Apache-2.0
+MODCARGO_CRATES +=     miow-0.1.3              # MIT/Apache-2.0
+MODCARGO_CRATES +=     net2-0.2.26             # MIT/Apache-2.0
+MODCARGO_CRATES +=     num-0.1.36              # MIT/Apache-2.0
+MODCARGO_CRATES +=     num-bigint-0.1.35       # MIT/Apache-2.0
+MODCARGO_CRATES +=     num-complex-0.1.35      # MIT/Apache-2.0
+MODCARGO_CRATES +=     num-integer-0.1.32      # MIT/Apache-2.0
+MODCARGO_CRATES +=     num-iter-0.1.32         # MIT/Apache-2.0
+MODCARGO_CRATES +=     num-rational-0.1.35     # MIT/Apache-2.0
+MODCARGO_CRATES +=     num-traits-0.1.36       # MIT/Apache-2.0
+MODCARGO_CRATES +=     num_cpus-1.0.0          # MIT/Apache-2.0
+MODCARGO_CRATES +=     openssl-0.7.14          # Apache-2.0
+MODCARGO_CRATES +=     openssl-sys-0.7.14      # MIT
+MODCARGO_CRATES +=     openssl-sys-extras-0.7.14 # MIT
+MODCARGO_CRATES +=     pkg-config-0.3.8        # MIT/Apache-2.0
+MODCARGO_CRATES +=     pnacl-build-helper-1.4.10 # MPL-2.0
+MODCARGO_CRATES +=     psapi-sys-0.1.0         # MIT
+MODCARGO_CRATES +=     rand-0.3.14             # MIT/Apache-2.0
+MODCARGO_CRATES +=     regex-0.1.77            # MIT/Apache-2.0
+MODCARGO_CRATES +=     regex-syntax-0.3.5      # MIT/Apache-2.0
+MODCARGO_CRATES +=     rustc-serialize-0.3.19  # MIT/Apache-2.0
+MODCARGO_CRATES +=     semver-0.5.1            # MIT/Apache-2.0
+MODCARGO_CRATES +=     semver-parser-0.6.1     # MIT/Apache-2.0
+MODCARGO_CRATES +=     strsim-0.3.0            # MIT
+MODCARGO_CRATES +=     tar-0.4.8               # MIT/Apache-2.0
+MODCARGO_CRATES +=     tempdir-0.3.5           # MIT/Apache-2.0
+MODCARGO_CRATES +=     term-0.4.4              # MIT/Apache-2.0
+MODCARGO_CRATES +=     thread-id-2.0.0         # Apache-2.0
+MODCARGO_CRATES +=     thread_local-0.2.6      # Apache-2.0/MIT
+MODCARGO_CRATES +=     toml-0.2.0              # MIT/Apache-2.0
+MODCARGO_CRATES +=     unicode-bidi-0.2.3      # MIT / Apache-2.0
+MODCARGO_CRATES +=     unicode-normalization-0.1.2 # MIT/Apache-2.0
+MODCARGO_CRATES +=     url-1.2.0               # MIT/Apache-2.0
+MODCARGO_CRATES +=     user32-sys-0.2.0        # MIT
+MODCARGO_CRATES +=     utf8-ranges-0.1.3       # Unlicense/MIT
+MODCARGO_CRATES +=     winapi-0.2.8            # MIT
+MODCARGO_CRATES +=     winapi-build-0.1.1      # MIT
+MODCARGO_CRATES +=     ws2_32-sys-0.2.1        # MIT
+
+MASTER_SITES0 = http://kapouay.odns.fr/pub/cargo/
+DISTFILES +=   cargo-bootstrap-${BOOTSTRAP_VERSION}.tar.gz:0
+
+MODULES =      devel/cargo \
+               lang/python
+
+# only deal with MODCARGO_CRATES
+MODCARGO_BUILDDEP =    No
+MODCARGO_BUILD =       No
+MODCARGO_INSTALL =     No
+MODCARGO_TEST =                No
 
-MODULES =      lang/python
-MODPY_RUNDEP = No
+MODPY_RUNDEP =         No
 
 USE_GMAKE =    Yes
 
@@ -134,34 +130,25 @@ LIB_DEPENDS =     net/curl \
 
 RUN_DEPENDS =  lang/rust
 
-CONFIGURE_STYLE =      simple
+CONFIGURE_STYLE =      simple \
+                       cargo
 CONFIGURE_ARGS +=      --prefix=${LOCALBASE} \
                        --mandir=${LOCALBASE}/man \
                        --local-rust-root=${LOCALBASE} \
                        
--local-cargo=${WRKDIR}/cargo-bootstrap-${BOOTSTRAP_VERSION}/cargo
 
-MAKE_ENV +=    CARGO_HOME=${WRKDIR}/cargo-home \
+MAKE_ENV +=    ${MODCARGO_ENV} \
                VERBOSE=1 \
                LIBSSH2_SYS_USE_PKG_CONFIG=1
 
+# make testsuite using the *same* binaries as build
+TEST_ENV +=    CARGOFLAGS="--release --no-fail-fast"
+
 post-extract:
        # place rust-installer inside WRKSRC
        rmdir ${WRKSRC}/src/rust-installer
        mv ${WRKDIR}/rust-installer-${RUSTINSTALL_INDEX} \
                ${WRKSRC}/src/rust-installer
-       # populate cargo registry to avoid downloading crates
-       mkdir -p ${WRKDIR}/cargo-home/registry/{cache,index,src}
-       mkdir 
${WRKDIR}/cargo-home/registry/{cache,src}/github.com-${REGISTRY_INDEX}
-       mv ${WRKDIR}/crates.io-index-${CRATESIO_INDEX} \
-               ${WRKDIR}/cargo-home/registry/index/github.com-${REGISTRY_INDEX}
-       touch 
${WRKDIR}/cargo-home/registry/index/github.com-${REGISTRY_INDEX}/.cargo-index-lock
-.for _crate in ${CRATES}
-       gzip < /dev/null \
-               > 
${WRKDIR}/cargo-home/registry/cache/github.com-${REGISTRY_INDEX}/${_crate}.crate
-       mv ${WRKDIR}/${_crate} \
-               ${WRKDIR}/cargo-home/registry/src/github.com-${REGISTRY_INDEX}
-       touch 
${WRKDIR}/cargo-home/registry/src/github.com-${REGISTRY_INDEX}/${_crate}/.cargo-ok
-.endfor
 
 SUBST_VARS +=  WRKBUILD
 pre-test:
@@ -188,5 +175,10 @@ bootstrap: fake
                | sed -ne 's,.* \(/.*/lib/lib.*\.so[.0-9]*\)$$,\1,p' \
                | xargs -r -J % cp % \
                        ${WRKDIR}/cargo-bootstrap-${BOOTSTRAP_NVERSION}
+
+# test-full: will rebuild and directly fetch crates
+test-full: configure pre-test
+       rm -rf ${WRKSRC}/.cargo
+       cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} ${GMAKE} test
 
 .include <bsd.port.mk>
Index: cargo.port.mk
===================================================================
RCS file: cargo.port.mk
diff -N cargo.port.mk
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ cargo.port.mk       13 Nov 2016 14:51:04 -0000
@@ -0,0 +1,118 @@
+# $OpenBSD$
+
+# List of static dependencies. The format is cratename-version.
+MODCARGO_CRATES ?=
+
+# List of features to also build (space separated).
+MODCARGO_FEATURES ?=
+
+DIST_SUBDIR ?= cargo
+
+# Reserve MASTER_SITES9 to grab crates.
+MASTER_SITES9 ?=       https://crates.io/api/v1/crates/
+.for _crate in ${MODCARGO_CRATES}
+DISTFILES +=   
${_crate}.tar.gz{${_crate:C/-[^-]*$//}/${_crate:C/^.*-//}/download}:9
+.endfor
+
+# Path of the crate make-checksum helper.
+MODCARGO_MAKE_CHECKSUM_BIN ?=
+.for _d in ${PORTSDIR_PATH:S/:/ /g}
+.  if exists(${_d}/devel/cargo/files/modcargo-make-checksum)
+MODCARGO_MAKE_CHECKSUM_BIN = ${_d}/devel/cargo/files/modcargo-make-checksum
+.  endif
+.endfor
+
+# pre-configure target for preparing crates directory.
+#  - place a config file for overriding crates-io index by local source
+MODCARGO_pre-configure = \
+       mkdir ${WRKSRC}/.cargo; \
+       echo "[source.modcargo]" >>${WRKSRC}/.cargo/config; \
+       echo "directory = '${WRKSRC}/modcargo-crates'" \
+               >>${WRKSRC}/.cargo/config; \
+       echo "[source.crates-io]" >>${WRKSRC}/.cargo/config; \
+       echo "replace-with = 'modcargo'" >>${WRKSRC}/.cargo/config; \
+       mkdir ${WRKSRC}/modcargo-crates;
+
+# for each crate
+#  - put the crate in the local crates directory
+#  - generate metadata of the crate
+.for _crate in ${MODCARGO_CRATES}
+MODCARGO_pre-configure += \
+       mv ${WRKDIR}/${_crate} ${WRKSRC}/modcargo-crates/${_crate}; \
+       sh ${MODCARGO_MAKE_CHECKSUM_BIN} \
+               ${FULLDISTDIR}/${_crate}.tar.gz \
+               ${WRKSRC}/modcargo-crates/${_crate};
+.endfor
+
+# Add build dependencies ?
+MODCARGO_BUILDDEP ?=   Yes
+.if ${MODCARGO_BUILDDEP:L} == "yes"
+BUILD_DEPENDS +=       devel/cargo \
+                       lang/rust
+.endif
+
+CATEGORIES +=          lang/rust
+
+# Location of cargo binary (default to devel/cargo binary)
+MODCARGO_BIN ?=        ${LOCALBASE}/bin/cargo
+
+# Environnment for cargo
+#  - CARGO_HOME: where to compile crates
+#  - RUSTC: path of rustc binary (default to lang/rust binary)
+MODCARGO_ENV ?=        CARGO_HOME=${WRKDIR}/cargo-home \
+               RUSTC=${LOCALBASE}/bin/rustc
+
+MODCARGO_RUN = \
+       cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} ${MODCARGO_ENV} ${MODCARGO_BIN}
+
+# Defaults arguments for cargo targets
+MODCARGO_BUILD_ARGS ?=         --release --verbose --jobs=${MAKE_JOBS}
+MODCARGO_INSTALL_ARGS ?=       --verbose --jobs=${MAKE_JOBS}
+MODCARGO_TEST_ARGS ?=          --no-fail-fast
+
+# Manage crate features
+.if !empty(MODCARGO_FEATURES)
+MODCARGO_BUILD_ARGS += --features='${MODCARGO_FEATURES}'
+MODCARGO_TEST_ARGS +=  --features='${MODCARGO_FEATURES}'
+.endif
+
+# Add a build target ?
+MODCARGO_BUILD ?=      Yes
+.if !target(do-build) && ${MODCARGO_BUILD:L} == "yes"
+do-build:
+       ${MODCARGO_RUN} build \
+               ${MODCARGO_BUILD_ARGS}
+.endif
+
+# Add an install target
+MODCARGO_INSTALL ?=    Yes
+.if !target(do-install) && ${MODCARGO_INSTALL:L} == "yes"
+do-install:
+       ${MODCARGO_RUN} install \
+               --root="${PREFIX}" \
+               ${MODCARGO_INSTALL_ARGS}
+       rm -- "${PREFIX}/.crates.toml"
+.endif
+
+# Add a test target ?
+MODCARGO_TEST ?=       Yes
+.if !target(do-test) && ${MODCARGO_TEST:L} == "yes"
+do-test:
+       ${MODCARGO_RUN} test \
+               ${MODCARGO_BUILD_ARGS} \
+               ${MODCARGO_TEST_ARGS}
+.endif
+
+# Helper targets for port maintener
+modcargo-crates-from-lock: patch
+       @awk '/"checksum / { print "MODCARGO_CRATES +=  " $$2 "-" $$3 }' \
+               <${WRKSRC}/Cargo.lock
+
+modcargo-crates-with-license: configure
+       @find ${WRKSRC}/modcargo-crates -name 'Cargo.toml' -maxdepth 2 \
+               -exec grep -H '^license' {} \; \
+               | sed \
+               -e 's|^${WRKSRC}/modcargo-crates/|MODCARGO_CRATES +=    |' \
+               -e 's|/Cargo.toml:license.*= *"|        # |' \
+               -e 's|"$$||g'
+
Index: distinfo
===================================================================
RCS file: /cvs/ports/devel/cargo/distinfo,v
retrieving revision 1.4
diff -u -p -r1.4 distinfo
--- distinfo    13 Nov 2016 08:59:26 -0000      1.4
+++ distinfo    13 Nov 2016 14:51:04 -0000
@@ -7,7 +7,6 @@ SHA256 (cargo/cargo-0.14.0.tar.gz) = kOw
 SHA256 (cargo/cargo-bootstrap-0.14.0-20161112.tar.gz) = 
sb6A3tG3aS54dLrlBIBVEpxtqLUGaohTFHtr6qR7jTY=
 SHA256 (cargo/cfg-if-0.1.0.tar.gz) = 
3h52DXtlNa9CQfyovYrfaOLn7azGsp9dOZBQxeSM+Iw=
 SHA256 (cargo/cmake-0.1.17.tar.gz) = 
389bzs5W75U7jqBCUJ6dy9/peCC34g2GvrU98w7ZSXg=
-SHA256 (cargo/crates.io-index-9f8c3a65f70b2a5723e0d9cc0a32d531ea42da67.tar.gz) 
= hXVtuRvjIZ0ly4gGKBIAcaKvGGtF09YVlAnGgyjW/0o=
 SHA256 (cargo/crossbeam-0.2.9.tar.gz) = 
+5dPg16QOQxfnfrADwWwbcEXKZ9epOhfvHu0Q69JEcw=
 SHA256 (cargo/curl-0.3.9.tar.gz) = +vVNknx1KwktPpnqIn2cfJtKPohaM2ism/oolY8hUQA=
 SHA256 (cargo/curl-sys-0.2.4.tar.gz) = 
TxmNEDeKO8HxsOO8Oi3lybueCJOEYN7Fe6ZmfZpl+8M=
@@ -17,6 +16,7 @@ SHA256 (cargo/filetime-0.1.10.tar.gz) = 
 SHA256 (cargo/flate2-0.2.14.tar.gz) = 
PutIHpVzBBeNLngvLaElfxQ03+y66IO6+2Gtoqn+o7s=
 SHA256 (cargo/fs2-0.2.5.tar.gz) = vNQU5aGpebkxu5L0G3pUEG0/bS5sJT6c6UO3zUaCUe8=
 SHA256 (cargo/gcc-0.3.35.tar.gz) = kezQN3Hv+wyWj9aVCzfolHaleKrxxwKX2OkrZRbsMxI=
+SHA256 (cargo/gdi32-sys-0.2.0.tar.gz) = 
CRJRWo/yS6kAQi7NqAC1L0AWpWJRki05fFdr+SxpBRg=
 SHA256 (cargo/git2-0.4.4.tar.gz) = M6lu7vInQDAGzbWepuBbqtjN3ea3mr7XU9lszuE2utI=
 SHA256 (cargo/git2-curl-0.5.0.tar.gz) = 
PV92bYBOPPK5Dhard8Pd7cscpdJFbK23s/kHNF+MNJg=
 SHA256 (cargo/glob-0.2.11.tar.gz) = 
i+GN4JpWtg7Q7fhLyd8AfjAEBpGves0cQYdPqsWJW/s=
@@ -26,6 +26,7 @@ SHA256 (cargo/kernel32-sys-0.2.2.tar.gz)
 SHA256 (cargo/lazy_static-0.2.1.tar.gz) = 
SSR+wqKFuz3LI8vZw1GTwCXnJRv853wdXal+Y2Lf/n8=
 SHA256 (cargo/libc-0.2.17.tar.gz) = 
BE0TYFk6ePXI5ecQvszcJKtx0fAbwZopvKzboi6Eddg=
 SHA256 (cargo/libgit2-sys-0.4.5.tar.gz) = 
MpPclRaaY1HFoD7KS/VUnzqaBjNqAAMVh2/xFlpfuhA=
+SHA256 (cargo/libressl-pnacl-sys-2.1.6.tar.gz) = 
y8BYlRq2o+81yhZGLXZCxIZ+ZANSCBHyhTek4vLbPnE=
 SHA256 (cargo/libssh2-sys-0.1.39.tar.gz) = 
HevX5W0ZZV63hvgnZ13FX21TDebXuB520T0a/GNdbAc=
 SHA256 (cargo/libz-sys-1.0.6.tar.gz) = 
QPLfdzC10pQmw+RM5NCI2MXe9kccLJO6mFhbifsgHOY=
 SHA256 (cargo/log-0.3.6.tar.gz) = q4NJe/i/TtKnQlnByAI1H81npluqhjlLa6c8NvSDgFQ=
@@ -46,6 +47,7 @@ SHA256 (cargo/openssl-0.7.14.tar.gz) = x
 SHA256 (cargo/openssl-sys-0.7.14.tar.gz) = 
uKxenZEd1MMgK79BObc7x6EjH30KOUMsb4k3RfDgQSA=
 SHA256 (cargo/openssl-sys-extras-0.7.14.tar.gz) = 
EcXh26fT0D2A8EW/DWARHcaSE7Z2UefIiVJ6O62rufo=
 SHA256 (cargo/pkg-config-0.3.8.tar.gz) = 
jO6ATsx+ryAaSiByQUcsyHDoJSBvbAMePuKnL6Ql8vo=
+SHA256 (cargo/pnacl-build-helper-1.4.10.tar.gz) = 
YckjHTGuqEUAdEPWL8u1i7aUmrnBgIHuHgmSDgzxEYs=
 SHA256 (cargo/psapi-sys-0.1.0.tar.gz) = 
q81dGgfTYOKXJ/dXqd7LPOi8bg76iWnPqtZpqDF6JHg=
 SHA256 (cargo/rand-0.3.14.tar.gz) = 
J5HYjG3vrHmcPyDXTwlMozuTMmEtmu+QeFGcguT+BKU=
 SHA256 (cargo/regex-0.1.77.tar.gz) = 
ZLA0RsRm01tC8qiyA8jgPti5HA8XtW4fhPchCiV6pmU=
@@ -64,6 +66,7 @@ SHA256 (cargo/toml-0.2.0.tar.gz) = pELfw
 SHA256 (cargo/unicode-bidi-0.2.3.tar.gz) = 
wffOuWr9/u3uQrreZaDVhaagEG9oG2dJyP9Nqo3zCz8=
 SHA256 (cargo/unicode-normalization-0.1.2.tar.gz) = 
JmQ6L4O6xV8ZdvtxbBAjRIX5IC3NZc+9+dpJhnsnEXI=
 SHA256 (cargo/url-1.2.0.tar.gz) = r+nsVLxNsUvIdEt/7QYNeFrHVnkUUJWbIkhEMxnVsRk=
+SHA256 (cargo/user32-sys-0.2.0.tar.gz) = 
TvRxHRB7IbQQo6l0sSBNmszIsQ2tddgyS111XeFhfUc=
 SHA256 (cargo/utf8-ranges-0.1.3.tar.gz) = 
ocoTwIxBycPgQiTtn/gEYdl+EhWJ/yfHU6FssQgwrg8=
 SHA256 (cargo/winapi-0.2.8.tar.gz) = 
Fn3J1pSam4V/NFEnXpEcP0QlWELB96dvM8VRA6kJCHo=
 SHA256 (cargo/winapi-build-0.1.1.tar.gz) = 
LTFe7js0rKR5ey2msT7Ygmbm1hJWKgxGOQr4KZ/Gmbw=
@@ -77,7 +80,6 @@ SIZE (cargo/cargo-0.14.0.tar.gz) = 62530
 SIZE (cargo/cargo-bootstrap-0.14.0-20161112.tar.gz) = 7324470
 SIZE (cargo/cfg-if-0.1.0.tar.gz) = 2758
 SIZE (cargo/cmake-0.1.17.tar.gz) = 10222
-SIZE (cargo/crates.io-index-9f8c3a65f70b2a5723e0d9cc0a32d531ea42da67.tar.gz) = 
2533290
 SIZE (cargo/crossbeam-0.2.9.tar.gz) = 35449
 SIZE (cargo/curl-0.3.9.tar.gz) = 53146
 SIZE (cargo/curl-sys-0.2.4.tar.gz) = 3196957
@@ -87,6 +89,7 @@ SIZE (cargo/filetime-0.1.10.tar.gz) = 88
 SIZE (cargo/flate2-0.2.14.tar.gz) = 46692
 SIZE (cargo/fs2-0.2.5.tar.gz) = 12661
 SIZE (cargo/gcc-0.3.35.tar.gz) = 23869
+SIZE (cargo/gdi32-sys-0.2.0.tar.gz) = 7643
 SIZE (cargo/git2-0.4.4.tar.gz) = 121616
 SIZE (cargo/git2-curl-0.5.0.tar.gz) = 4060
 SIZE (cargo/glob-0.2.11.tar.gz) = 18065
@@ -96,6 +99,7 @@ SIZE (cargo/kernel32-sys-0.2.2.tar.gz) =
 SIZE (cargo/lazy_static-0.2.1.tar.gz) = 688253
 SIZE (cargo/libc-0.2.17.tar.gz) = 108320
 SIZE (cargo/libgit2-sys-0.4.5.tar.gz) = 4133755
+SIZE (cargo/libressl-pnacl-sys-2.1.6.tar.gz) = 2697179
 SIZE (cargo/libssh2-sys-0.1.39.tar.gz) = 389357
 SIZE (cargo/libz-sys-1.0.6.tar.gz) = 601369
 SIZE (cargo/log-0.3.6.tar.gz) = 16110
@@ -116,6 +120,7 @@ SIZE (cargo/openssl-0.7.14.tar.gz) = 638
 SIZE (cargo/openssl-sys-0.7.14.tar.gz) = 10156
 SIZE (cargo/openssl-sys-extras-0.7.14.tar.gz) = 3871
 SIZE (cargo/pkg-config-0.3.8.tar.gz) = 10814
+SIZE (cargo/pnacl-build-helper-1.4.10.tar.gz) = 5470
 SIZE (cargo/psapi-sys-0.1.0.tar.gz) = 973
 SIZE (cargo/rand-0.3.14.tar.gz) = 54768
 SIZE (cargo/regex-0.1.77.tar.gz) = 185559
@@ -134,6 +139,7 @@ SIZE (cargo/toml-0.2.0.tar.gz) = 46886
 SIZE (cargo/unicode-bidi-0.2.3.tar.gz) = 1744003
 SIZE (cargo/unicode-normalization-0.1.2.tar.gz) = 612931
 SIZE (cargo/url-1.2.0.tar.gz) = 68332
+SIZE (cargo/user32-sys-0.2.0.tar.gz) = 10624
 SIZE (cargo/utf8-ranges-0.1.3.tar.gz) = 8422
 SIZE (cargo/winapi-0.2.8.tar.gz) = 455145
 SIZE (cargo/winapi-build-0.1.1.tar.gz) = 669
Index: files/modcargo-make-checksum
===================================================================
RCS file: files/modcargo-make-checksum
diff -N files/modcargo-make-checksum
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ files/modcargo-make-checksum        13 Nov 2016 14:51:04 -0000
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+usage() {
+       echo "usage: ${0##*/} package directory" >&2
+       exit 1
+}
+
+[[ $# -ne 2 || ! -r "$1" || ! -d "$2" ]] && usage;
+
+package="$1"
+directory="$2"
+
+package_hash=$(sha256 -q ${package})
+
+cd "$directory"
+[[ -e .cargo-ok ]] && rm .cargo-ok
+
+exec >.cargo-checksum.json
+
+echo '{"files":{'
+find . -type f ! -name '.cargo-checksum.json' -print0 \
+       | xargs -0 sha256 \
+       | sed -e 's|^SHA256 (\./\([^"]*\)) = \([^ ]*\)$|"\1": "\2",|'
+
+touch .cargo-ok
+cat <<EOF
+".cargo-ok": 
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},
+"package": "${package_hash}"}
+EOF

Reply via email to