Skip to content

Commit da1bd76

Browse files
committed
Merge branch 'master' of github.com:nipy/nipype into fix/mnibias
2 parents ba1a863 + 1a93a17 commit da1bd76

File tree

739 files changed

+2620
-1436
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

739 files changed

+2620
-1436
lines changed

.dockerignore

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ nipype.egg-info
1515
src/**/*
1616
src/
1717

18-
# releasing
19-
Makefile
20-
2118
# git
2219
.gitignore
2320
.git/**/*

CHANGES

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
Upcoming release 0.13
22
=====================
33

4+
* ENH: DVARS includes intensity normalization feature - turned on by default (https://github.com/nipy/nipype/pull/1827)
5+
* FIX: DVARS is correctly using sum of squares instead of standard deviation (https://github.com/nipy/nipype/pull/1827)
6+
* ENH: Refactoring of nipype.interfaces.utility (https://github.com/nipy/nipype/pull/1828)
7+
* FIX: CircleCI were failing silently. Some fixes to tests (https://github.com/nipy/nipype/pull/1833)
8+
* FIX: Issues in Docker image permissions, and docker documentation (https://github.com/nipy/nipype/pull/1825)
49
* ENH: Revised all Dockerfiles and automated deployment to Docker Hub
510
from CircleCI (https://github.com/nipy/nipype/pull/1815)
611
* FIX: Semaphore capture using MultiProc plugin (https://github.com/nipy/nipype/pull/1689)

Dockerfile

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,19 @@
3131
# Based on https://github.com/poldracklab/fmriprep/blob/9c92a3de9112f8ef1655b876de060a2ad336ffb0/Dockerfile
3232
#
3333
FROM ubuntu:xenial-20161213
34+
MAINTAINER The nipype developers https://github.com/nipy/nipype
35+
36+
ARG DEBIAN_FRONTEND=noninteractive
37+
38+
# Pre-cache neurodebian key
39+
COPY docker/files/neurodebian.gpg /root/.neurodebian.gpg
3440

3541
# Prepare environment
36-
RUN apt-get update && \
42+
RUN apt-key add /root/.neurodebian.gpg && \
43+
apt-get update && \
3744
apt-get install -y --no-install-recommends curl bzip2 ca-certificates xvfb && \
3845
curl -sSL http://neuro.debian.net/lists/xenial.us-ca.full >> /etc/apt/sources.list.d/neurodebian.sources.list && \
39-
apt-key adv --recv-keys --keyserver hkp://pgp.mit.edu:80 0xA5D32F012649A5A9 && \
46+
apt-key adv --refresh-keys --keyserver hkp://ha.pool.sks-keyservers.net 0xA5D32F012649A5A9 || true; \
4047
apt-get update
4148

4249
# Installing freesurfer
@@ -78,6 +85,7 @@ RUN echo "cHJpbnRmICJrcnp5c3p0b2YuZ29yZ29sZXdza2lAZ21haWwuY29tXG41MTcyXG4gKkN2dW
7885
# Installing Neurodebian packages (FSL, AFNI, git)
7986
RUN apt-get install -y --no-install-recommends \
8087
fsl-core=5.0.9-1~nd+1+nd16.04+1 \
88+
fsl-mni152-templates=5.0.7-2 \
8189
afni=16.2.07~dfsg.1-2~nd16.04+1
8290

8391
ENV FSLDIR=/usr/share/fsl/5.0 \
@@ -171,7 +179,7 @@ RUN conda config --add channels conda-forge --add channels intel && \
171179
chmod +x /usr/local/miniconda/bin/* && \
172180
conda config --set always_yes yes --set changeps1 no && \
173181
conda update -q conda && \
174-
chmod +x /usr/local/miniconda/bin/* && \
182+
chmod +x /usr/local/miniconda/bin/*; sync && \
175183
conda install -y mkl=2017.0.1 \
176184
numpy=1.11.2 \
177185
scipy=0.18.1 \
@@ -182,7 +190,8 @@ RUN conda config --add channels conda-forge --add channels intel && \
182190
libxslt=1.1.29 \
183191
traits=4.6.0 \
184192
psutil=5.0.1 \
185-
icu=58.1
193+
icu=58.1 && \
194+
find /usr/local/miniconda/ -exec chmod 775 {} +
186195

187196
# matplotlib cleanups: set default backend, precaching fonts
188197
RUN sed -i 's/\(backend *: \).*$/\1Agg/g' /usr/local/miniconda/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc && \
@@ -195,7 +204,7 @@ ENV MKL_NUM_THREADS=1 \
195204

196205
# Installing dev requirements (packages that are not in pypi)
197206
WORKDIR /root/
198-
ADD requirements.txt requirements.txt
207+
COPY requirements.txt requirements.txt
199208
RUN pip install -r requirements.txt && \
200209
rm -rf ~/.cache/pip
201210

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ trailing-spaces:
3232

3333
clean-pyc:
3434
find . -name "*.pyc" | xargs rm -f
35+
find . -name "__pycache__" -type d | xargs rm -rf
3536

3637
clean-so:
3738
find . -name "*.so" | xargs rm -f
@@ -70,7 +71,7 @@ html:
7071

7172
specs:
7273
@echo "Checking specs and autogenerating spec tests"
73-
python tools/checkspecs.py
74+
env PYTHONPATH=".:$(PYTHONPATH)" python tools/checkspecs.py
7475

7576
check: check-before-commit # just a shortcut
7677
check-before-commit: specs trailing-spaces html test

circle.yml

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,21 @@ dependencies:
2525
- mkdir -p $SCRATCH && sudo setfacl -d -m group:ubuntu:rwx $SCRATCH && sudo setfacl -m group:ubuntu:rwx $SCRATCH
2626
- mkdir -p $HOME/docker $HOME/examples $SCRATCH/pytest $SCRATCH/logs
2727
override:
28+
- if [[ -e $HOME/docker/cache.tar ]]; then docker load --input $HOME/docker/image.tar; else echo 'No docker image found in cache'; fi :
29+
timeout: 6000
2830
- if [[ ! -d ~/examples/nipype-tutorial ]]; then wget --retry-connrefused --waitretry=5 --read-timeout=20 --timeout=15 -t 0 -q -O nipype-tutorial.tar.bz2 "${DATA_NIPYPE_TUTORIAL_URL}" && tar xjf nipype-tutorial.tar.bz2 -C ~/examples/; fi
2931
- if [[ ! -d ~/examples/nipype-fsl_course_data ]]; then wget --retry-connrefused --waitretry=5 --read-timeout=20 --timeout=15 -t 0 -q -O nipype-fsl_course_data.tar.gz "${DATA_NIPYPE_FSL_COURSE}" && tar xzf nipype-fsl_course_data.tar.gz -C ~/examples/; fi
3032
- if [[ ! -d ~/examples/feeds ]]; then wget --retry-connrefused --waitretry=5 --read-timeout=20 --timeout=15 -t 0 -q -O fsl-5.0.9-feeds.tar.gz "${DATA_NIPYPE_FSL_FEEDS}" && tar xzf fsl-5.0.9-feeds.tar.gz -C ~/examples/; fi
31-
- if [[ -e $HOME/docker/image.tar ]]; then docker load -i $HOME/docker/image.tar; fi
32-
- if [[ -e $HOME/docker/image27.tar ]]; then docker load -i $HOME/docker/image27.tar; fi
33-
- if [[ -e $HOME/docker/image35.tar ]]; then docker load -i $HOME/docker/image35.tar; fi
33+
- docker images
3434
- sed -i -E "s/(__version__ = )'[A-Za-z0-9.-]+'/\1'$CIRCLE_TAG'/" nipype/info.py
3535
- e=1 && for i in {1..5}; do docker build -t nipype/nipype:latest --build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` --build-arg VCS_REF=`git rev-parse --short HEAD` --build-arg VERSION=$CIRCLE_TAG . && e=0 && break || sleep 15; done && [ "$e" -eq "0" ] :
3636
timeout: 21600
37-
- docker build -f docker/Dockerfile_py27 -t nipype/nipype_test:py27 . :
37+
- e=1 && for i in {1..5}; do docker build -f docker/Dockerfile_py27 -t nipype/nipype_test:py27 . && e=0 && break || sleep 15; done && [ "$e" -eq "0" ] :
3838
timeout: 1600
39-
- docker build -f docker/Dockerfile_py35 -t nipype/nipype_test:py35 . :
39+
- e=1 && for i in {1..5}; do docker build -f docker/Dockerfile_py35 -t nipype/nipype_test:py35 . && e=0 && break || sleep 15; done && [ "$e" -eq "0" ] :
4040
timeout: 1600
41-
- docker save nipype/nipype:latest > $HOME/docker/image.tar
42-
- docker save nipype/nipype_test:py27 > $HOME/docker/image27.tar
43-
- docker save nipype/nipype_test:py35 > $HOME/docker/image35.tar
41+
- docker save -o $HOME/docker/cache.tar nipype/nipype:latest nipype/nipype_test:py27 nipype/nipype_test:py35 :
42+
timeout: 6000
4443

4544
test:
4645
override:

doc/devel/testing_nipype.rst

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,26 +107,47 @@ This will skip any tests that require matlab.
107107
Testing Nipype using Docker
108108
---------------------------
109109

110-
As of :code:`nipype-0.13`, Nipype is tested inside Docker containers. Once the developer
111-
`has installed the Docker Engine <https://docs.docker.com/engine/installation/>`_, testing
112-
Nipype is as easy as follows::
110+
As of :code:`nipype-0.13`, Nipype is tested inside Docker containers. First, install the
111+
`Docker Engine <https://docs.docker.com/engine/installation/>`_.
112+
Nipype has one base docker image called nipype/nipype, and several additional test images
113+
for various Python versions.
114+
115+
The base nipype/nipype image is built as follows::
113116

114117
cd path/to/nipype/
115-
docker build -f docker/nipype_test/Dockerfile_py27 -t nipype/nipype_test:py27
116-
docker run -it --rm -v /etc/localtime:/etc/localtime:ro \
117-
-e FSL_COURSE_DATA="/root/examples/nipype-fsl_course_data" \
118+
docker build -t nipype/nipype .
119+
120+
This base image contains several useful tools (FreeSurfer, AFNI, FSL, ANTs, etc.) and
121+
a nipype installation, all in Python 3.5.
122+
It is possible to fetch a built image from the latest master branch of nipype
123+
using::
124+
125+
docker run -it --rm nipype/nipype:master
126+
127+
128+
The docker run command will then open the container and offer a bash shell for the
129+
developer.
130+
131+
The additional test images have several test scripts installed. For instance,
132+
to build and run all tests on Python 2.7::
133+
134+
cd path/to/nipype/
135+
docker build -f docker/Dockerfile_py27 -t nipype/nipype_test:py27 .
136+
docker run -it --rm -e FSL_COURSE_DATA="/root/examples/nipype-fsl_course_data" \
118137
-v ~/examples:/root/examples:ro \
119138
-v ~/scratch:/scratch \
120139
-w /root/src/nipype \
121-
nipype/nipype_test:py27 /usr/bin/run_pytest.sh
140+
nipype/nipype_test:py27 /usr/bin/run_pytests.sh
122141

123142
For running nipype in Python 3.5::
124143

125144
cd path/to/nipype/
126-
docker build -f docker/nipype_test/Dockerfile_py35 -t nipype/nipype_test:py35
127-
docker run -it --rm -v /etc/localtime:/etc/localtime:ro \
128-
-e FSL_COURSE_DATA="/root/examples/nipype-fsl_course_data" \
145+
docker build -f docker/Dockerfile_py35 -t nipype/nipype_test:py35 .
146+
docker run -it --rm -e FSL_COURSE_DATA="/root/examples/nipype-fsl_course_data" \
129147
-v ~/examples:/root/examples:ro \
130148
-v ~/scratch:/scratch \
131149
-w /root/src/nipype \
132-
nipype/nipype_test:py35 /usr/bin/run_pytest.sh
150+
nipype/nipype_test:py35 /usr/bin/run_pytests.sh
151+
152+
The last two examples assume that the example data is downladed into ~/examples and
153+
the ~/scratch folder will be created if it does not exist previously.

docker/Dockerfile_base

Lines changed: 0 additions & 127 deletions
This file was deleted.

docker/files/neurodebian.gpg

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
-----BEGIN PGP PUBLIC KEY BLOCK-----
2+
Version: GnuPG v1
3+
4+
mQGiBEQ7TOgRBADvaRsIZ3VZ6Qy7PlDpdMm97m0OfvouOj/HhjOM4M3ECbGn4cYh
5+
vN1gK586s3sUsUcNQ8LuWvNsYhxYsVTZymCReJMEDxod0U6/z/oIbpWv5svF3kpl
6+
ogA66Ju/6cZx62RiCSOkskI6A3Waj6xHyEo8AGOPfzbMoOOQ1TS1u9s2FwCgxziL
7+
wADvKYlDZnWM03QtqIJVD8UEAOks9Q2OqFoqKarj6xTRdOYIBVEp2jhozZUZmLmz
8+
pKL9E4NKGfixqxdVimFcRUGM5h7R2w7ORqXjCzpiPmgdv3jJLWDnmHLmMYRYQc8p
9+
5nqo8mxuO3zJugxBemWoacBDd1MJaH7nK20Hsk9L/jvU/qLxPJotMStTnwO+EpsK
10+
HlihA/9ZpvzR1QWNUd9nSuNR3byJhaXvxqQltsM7tLqAT4qAOJIcMjxr+qESdEbx
11+
NHM5M1Y21ZynrsQw+Fb1WHXNbP79vzOxHoZR0+OXe8uUpkri2d9iOocre3NUdpOO
12+
JHtl6cGGTFILt8tSuOVxMT/+nlo038JQB2jARe4B85O0tkPIPbQybmV1cm8uZGVi
13+
aWFuLm5ldCBhcmNoaXZlIDxtaWNoYWVsLmhhbmtlQGdtYWlsLmNvbT6IRgQQEQgA
14+
BgUCTVHJKwAKCRCNEUVjdcAkyOvzAJ0abJz+f2a6VZG1c9T8NHMTYh1atwCgt0EE
15+
3ZZd/2in64jSzu0miqhXbOKISgQQEQIACgUCSotRlwMFAXgACgkQ93+NsjFEvg8n
16+
JgCfWcdJbILBtpLZCocvOzlLPqJ0Fn0AoI4EpJRxoUnrtzBGUC1MqecU7WsDiGAE
17+
ExECACAFAkqLUWcCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRCl0y8BJkml
18+
qVklAJ4h2V6MdQkSAThF5c2Gkq6eSoIQYQCeM0DWyB9Bl+tTPSTYXwwZi2uoif20
19+
QmFwc3kuZ3NlLnVuaS1tYWdkZWJ1cmcuZGUgRGViaWFuIEFyY2hpdmUgPG1pY2hh
20+
ZWwuaGFua2VAZ21haWwuY29tPohGBBARAgAGBQJEO03FAAoJEPd/jbIxRL4PU18A
21+
n3tn7i4qdlMi8kHbYWFoabsKc9beAJ9sl/leZNCYNMGhz+u6BQgyeLKw94heBBMR
22+
AgAeBQJEO0zoAhsDBgsJCAcDAgMVAgMDFgIBAh4BAheAAAoJEKXTLwEmSaWpVdoA
23+
n27DvtZizNEbhz3wRUPQMiQjtqdvAJ9rS9YdPe5h5o5gHx3mw3BSkOttdYheBBMR
24+
AgAeBQJEO0zoAhsDBgsJCAcDAgMVAgMDFgIBAh4BAheAAAoJEKXTLwEmSaWpVdoA
25+
oLhwWL+E+2I9lrUf4Lf26quOK9vLAKC9ZpIF2tUirFFkBWnQvu13/TA0SokCHAQQ
26+
AQIABgUCTSNBgQAKCRDAc9Iof/uem4NpEACQ8jxmaCaS/qk/Y4GiwLA5bvKosG3B
27+
iARZ2v5UWqCZQ1tS56yKse/lCIzXQqU9BnYW6wOI2rvFf9meLfd8h96peG6oKscs
28+
fbclLDIf68bBvGBQaD0VYFi/Fk/rxmTQBOCQ3AJZs8O5rIM4gPGE0QGvSZ1h7VRw
29+
3Uyeg4jKXLIeJn2xEmOJgt3auAR2FyKbzHaX9JCoByJZ/eU23akNl9hgt7ePlpXo
30+
74KNYC58auuMUhCq3BQDB+II4ERYMcmFp1N5ZG05Cl6jcaRRHDXz+Ax6DWprRI1+
31+
RH/Yyae6LmKpeJNwd+vM14aawnNO9h8IAQ+aJ3oYZdRhGyybbin3giJ10hmWveg/
32+
Pey91Nh9vBCHdDkdPU0s9zE7z/PHT0c5ccZRukxfZfkrlWQ5iqu3V064ku5f4PBy
33+
8UPSkETcjYgDnrdnwqIAO+oVg/SFlfsOzftnwUrvwIcZlXAgtP6MEEAs/38e/JIN
34+
g4VrpdAy7HMGEUsh6Ah6lvGQr+zBnG44XwKfl7e0uCYkrAzUJRGM5vx9iXvFMcMu
35+
jv9EBNNBOU8/Y6MBDzGZhgaoeI27nrUvaveJXjAiDKAQWBLjtQjINZ8I9uaSGOul
36+
8kpbFavE4eS3+KhISrSHe4DuAa3dk9zI+FiPvXY1ZyfQBtNpR+gYFY6VxMbHhY1U
37+
lSLHO2eUIQLdYbRITmV1cm9EZWJpYW4gQXJjaGl2ZSBLZXkgPHBrZy1leHBwc3kt
38+
bWFpbnRhaW5lcnNAbGlzdHMuYWxpb3RoLmRlYmlhbi5vcmc+iEYEEBEIAAYFAk1R
39+
yQYACgkQjRFFY3XAJMgEWwCggx4Gqlcrt76TSMlbU94cESo55AEAoJ3asQEMpe8t
40+
QUX+5aikw3z1AUoCiEoEEBECAAoFAkqf/3cDBQF4AAoJEPd/jbIxRL4PxyMAoKUI
41+
RPWlHCj/+HSFfwhos68wcSwmAKChuC00qutDro+AOo+uuq6YoHXj+ohgBBMRAgAg
42+
BQJKn/8bAhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQpdMvASZJpalDggCe
43+
KF9KOgOPdQbFnKXl8KtHory4EEwAnA7jxgorE6kk2QHEXFSF8LzOOH4GiGMEExEC
44+
ACMCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCSp//RgIZAQAKCRCl0y8BJkml
45+
qekFAKCRyt4+FoCzmBbRUUP3Cr8PzH++IgCgkno4vdjsWdyAey8e0KpITTXMFrmJ
46+
AhwEEAECAAYFAk0jQYEACgkQwHPSKH/7npsFfw/+P8B8hpM3+T1fgboBa4R32deu
47+
n8m6b8vZMXwuo/awQtMpzjem8JGXSUQm8iiX4hDtjq6ZoPrlN8T4jNmviBt/F5jI
48+
Jji/PYmhq+Zn9s++mfx+aF4IJrcHJWFkg/6kJzn4oSdl/YlvKf4VRCcQNtj4xV87
49+
GsdamnzU17XapLVMbSaVKh+6Af7ZLDerEH+iAq733HsYaTK+1xKmN7EFVXgS7bZ1
50+
9C4LTzc97bVHSywpT9yIrg9QQs/1kshfVIHDKyhjF6IwzSVbeGAIL3Oqo5zOMkWv
51+
7JlEIkkhTyl+FETxNMTMYjAk+Uei3kRodneq3YBF2uFYSEzrXQgHAyn37geiaMYj
52+
h8wu6a85nG1NS0SdxiZDIePmbvD9vWxFZUWYJ/h9ifsLivWcVXlvHoQ0emd+n2ai
53+
FhAck2xsuyHgnGIZMHww5IkQdu/TMqvbcR6d8Xulh+C4Tq7ppy+oTLADSBKII++p
54+
JQioYydRD529EUJgVlhyH27X6YAk3FuRD3zYZRYS2QECiKXvS665o3JRJ0ZSqNgv
55+
YOom8M0zz6bI9grnUoivMI4o7ISpE4ZwffEd37HVzmraaUHDXRhkulFSf1ImtXoj
56+
V9nNSM5p/+9eP7OioTZhSote6Vj6Ja1SZeRkXZK7BwqPbdO0VsYOb7G//ZiOlqs+
57+
paRr92G/pwBfj5Dq8EK5Ag0ERDtM9RAIAN0EJqBPvLN0tEin/y4Fe0R4n+E+zNXg
58+
bBsq4WidwyUFy3h/6u86FYvegXwUqVS2OsEs5MwPcCVJOfaEthF7I89QJnP9Nfx7
59+
V5I9yFB53o9ii38BN7X+9gSjpfwXOvf/wIDfggxX8/wRFel37GRB7TiiABRArBez
60+
s5x+zTXvT++WPhElySj0uY8bjVR6tso+d65K0UesvAa7PPWeRS+3nhqABSFLuTTT
61+
MMbnVXCGesBrYHlFVXClAYrSIOX8Ub/UnuEYs9+hIV7U4jKzRF9WJhIC1cXHPmOh
62+
vleAf/I9h/0KahD7HLYud40pNBo5tW8jSfp2/Q8TIE0xxshd51/xy4MAAwUH+wWn
63+
zsYVk981OKUEXul8JPyPxbw05fOd6gF4MJ3YodO+6dfoyIl3bewk+11KXZQALKaO
64+
1xmkAEO1RqizPeetoadBVkQBp5xPudsVElUTOX0pTYhkUd3iBilsCYKK1/KQ9KzD
65+
I+O/lRsm6L9lc6rV0IgPU00P4BAwR+x8Rw7TJFbuS0miR3lP1NSguz+/kpjxzmGP
66+
LyHJ+LVDYFkk6t0jPXhqFdUY6McUTBDEvavTGlVO062l9APTmmSMVFDsPN/rBes2
67+
rYhuuT+lDp+gcaS1UoaYCIm9kKOteQBnowX9V74Z+HKEYLtwILaSnNe6/fNSTvyj
68+
g0z+R+sPCY4nHewbVC+ISQQYEQIACQUCRDtM9QIbDAAKCRCl0y8BJkmlqbecAJ9B
69+
UdSKVg9H+fQNyP5sbOjj4RDtdACfXHrRHa2+XjJP0dhpvJ8IfvYnQsU=
70+
=fAJZ
71+
-----END PGP PUBLIC KEY BLOCK-----

docker/files/run_builddocs.sh

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,4 @@ set -u
66
mkdir -p /scratch/docs
77
make html 2>&1 | tee /scratch/builddocs.log
88
cp -r /root/src/nipype/doc/_build/html/* /scratch/docs/
9-
chmod 777 -R /scratch/docs
10-
chmod 777 /scratch/builddocs.log
119
cat /scratch/builddocs.log && if grep -q "ERROR" /scratch/builddocs.log; then false; else true; fi

docker/files/run_examples.sh

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,3 @@ coverage run /root/src/nipype/tools/run_examples.py $@
1515
arr=$@
1616
tmp_var=$( IFS=$' '; echo "${arr[*]}" )
1717
coverage xml -o "/scratch/smoketest_${tmp_var//[^A-Za-z0-9_-]/_}.xml"
18-
19-
chmod 777 -R /scratch/logs

0 commit comments

Comments
 (0)