aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCam Cope <github@camcope.me>2021-08-30 07:35:33 -0700
committerGitHub <noreply@github.com>2021-08-30 15:35:33 +0100
commitd54c7ecbd618afb4df524e0d96dec7fe7cc2935d (patch)
tree4ffa94f7ab1e76c2657540bab4a0e358d857bfb3
parent803e0e65cf63fdc95c7ad4a519a5db31d27f94d4 (diff)
downloadsshfs-d54c7ecbd618afb4df524e0d96dec7fe7cc2935d.tar
sshfs-d54c7ecbd618afb4df524e0d96dec7fe7cc2935d.tar.gz
sshfs-d54c7ecbd618afb4df524e0d96dec7fe7cc2935d.tar.bz2
sshfs-d54c7ecbd618afb4df524e0d96dec7fe7cc2935d.zip
Fixup whitespace and configure CI to keep it that way
-rw-r--r--.pre-commit-config.yaml14
-rw-r--r--.travis.yml18
-rw-r--r--ChangeLog.rst14
-rw-r--r--README.rst2
-rw-r--r--cache.c12
-rwxr-xr-xmake_release_tarball.sh1
-rw-r--r--meson.build3
-rw-r--r--sshfs.c40
-rw-r--r--sshfs.rst16
-rwxr-xr-xtest/appveyor-build.sh1
-rwxr-xr-xtest/lint.sh4
-rw-r--r--test/meson.build2
-rwxr-xr-xtest/test_sshfs.py12
-rwxr-xr-xtest/travis-build.sh12
-rw-r--r--test/util.py2
15 files changed, 92 insertions, 61 deletions
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..8150152
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,14 @@
+# See https://pre-commit.com for more information
+# See https://pre-commit.com/hooks.html for more hooks
+repos:
+- repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.0.1
+ hooks:
+ - id: trailing-whitespace
+ - id: end-of-file-fixer
+ - id: check-yaml
+ - id: check-added-large-files
+- repo: https://github.com/jumanjihouse/pre-commit-hooks
+ rev: 2.1.5
+ hooks:
+ - id: shellcheck
diff --git a/.travis.yml b/.travis.yml
index b19fd56..cbd3963 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,11 +1,14 @@
dist: focal
-sudo: enabled
-language:
- - c
+language: c
+
+cache:
+ - pip
+
addons:
apt:
packages:
+ - shellcheck
- valgrind
- gcc
- clang
@@ -16,6 +19,13 @@ addons:
- meson
- python3-pytest
- libglib2.0-dev
+
install: test/travis-install.sh
-script: test/travis-build.sh
+jobs:
+ include:
+ - name: Lint
+ script: ./test/lint.sh
+ install: skip
+ - name: Build + Test
+ script: test/travis-build.sh
diff --git a/ChangeLog.rst b/ChangeLog.rst
index ae0fd10..b68be94 100644
--- a/ChangeLog.rst
+++ b/ChangeLog.rst
@@ -25,7 +25,7 @@ Release 3.7.0 (2020-01-03)
needed anymore. If you depend on this workaround, please let the SSHFS maintainers know,
otherwise support for the workaround will be removed completely in a future version.
-
+
Release 3.6.0 (2019-11-03)
--------------------------
@@ -108,13 +108,13 @@ Release 3.1.0 (2017-08-04)
* For improved backwards compatibility, SSHFS now also silently
accepts the old ``-o cache_*`` options.
-
+
Release 3.0.0 (2017-07-08)
--------------------------
* sshfs now requires libfuse 3.1.0 or newer.
* When supported by the kernel, sshfs now uses writeback caching.
-* The `cache` option has been renamed to `dir_cache` for clarity.
+* The `cache` option has been renamed to `dir_cache` for clarity.
* Added unit tests
* --debug now behaves like -o debug_sshfs, i.e. it enables sshfs
debugging messages rather than libfuse debugging messages.
@@ -129,7 +129,7 @@ Release 3.0.0 (2017-07-08)
* Removed support for `-o workaround=all`. Workarounds should always
enabled explicitly and only when needed. There is no point in always
enabling a potentially changing set of workarounds.
-
+
Release 2.9 (2017-04-17)
------------------------
@@ -168,14 +168,14 @@ Release 2.4 (2012-03-08)
------------------------
* New `slave` option.
-* New `idmap`, `uidmap` and `gidmap` options.
+* New `idmap`, `uidmap` and `gidmap` options.
* Various small bugfixes.
Release 2.3 (2011-07-01)
------------------------
* Support hard link creation if server is OpenSSH 5.7 or later
-* Small improvements and bug fixes
+* Small improvements and bug fixes
* Check mount point and options before connecting to ssh server
* New 'delay_connect' option
@@ -188,7 +188,7 @@ Release 2.2 (2008-10-20)
Release 2.1 (2008-07-11)
------------------------
-* Small improvements and bug fixes
+* Small improvements and bug fixes
Release 2.0 (2008-04-23)
------------------------
diff --git a/README.rst b/README.rst
index 801846c..825e048 100644
--- a/README.rst
+++ b/README.rst
@@ -72,7 +72,7 @@ Normally, the default build options will work fine. If you
nevertheless want to adjust them, you can do so with the *mesonconf*
command::
- $ mesonconf # list options
+ $ mesonconf # list options
$ mesonconf -D strip=true # set an option
To build, test and install SSHFS, you then use Ninja (running the
diff --git a/cache.c b/cache.c
index 403c251..9436c5a 100644
--- a/cache.c
+++ b/cache.c
@@ -256,7 +256,7 @@ static void *cache_init(struct fuse_conn_info *conn,
{
void *res;
res = cache.next_oper->init(conn, cfg);
-
+
// Cache requires a path for each request
cfg->nullpath_ok = 0;
@@ -318,9 +318,9 @@ static int cache_releasedir(const char *path, struct fuse_file_info *fi)
{
int err;
struct file_handle *cfi;
-
+
cfi = (struct file_handle*) fi->fh;
-
+
if(cfi->is_open) {
fi->fh = cfi->fs_fh;
err = cache.next_oper->releasedir(path, fi);
@@ -365,7 +365,7 @@ static int cache_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
struct node *node;
assert(offset == 0);
-
+
pthread_mutex_lock(&cache.lock);
node = cache_lookup(path);
if (node != NULL && node->dir != NULL) {
@@ -391,8 +391,8 @@ static int cache_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
}
cfi->is_open = 1;
cfi->fs_fh = fi->fh;
- }
-
+ }
+
ch.path = path;
ch.buf = buf;
ch.filler = filler;
diff --git a/make_release_tarball.sh b/make_release_tarball.sh
index 02095b6..8c17abe 100755
--- a/make_release_tarball.sh
+++ b/make_release_tarball.sh
@@ -27,4 +27,3 @@ gpg --armor --detach-sign "${TAG}.tar.xz"
PREV_TAG="$(git tag --list 'sshfs-3*' --sort=-taggerdate --merged "${TAG}^"| head -1)"
echo "Contributors from ${PREV_TAG} to ${TAG}:"
git log --pretty="format:%an <%aE>" "${PREV_TAG}..${TAG}" | sort -u
-
diff --git a/meson.build b/meson.build
index 299d051..ec6f9b4 100644
--- a/meson.build
+++ b/meson.build
@@ -26,7 +26,7 @@ endif
rst2man = find_program('rst2man', 'rst2man.py', required: false)
-
+
cfg = configuration_data()
cfg.set_quoted('PACKAGE_VERSION', meson.project_version())
@@ -69,4 +69,3 @@ meson.add_install_script('utils/install_helper.sh',
subdir('test')
-
diff --git a/sshfs.c b/sshfs.c
index 32130e1..8addecb 100644
--- a/sshfs.c
+++ b/sshfs.c
@@ -141,7 +141,7 @@
/*
Handling of multiple SFTP connections
--------------------------------------
-
+
An SFTP server is free to return responses to outstanding requests in arbitrary
order. However, execution of requests may only be re-ordered and parallelized as long
as "the results in the responses will be the same as if [the client] had sent the
@@ -158,11 +158,11 @@
involved) wait for the other requests to complete. This means that e.g. a readdir
request would have to block on most other activity in the same directory, eliminating a
major advantage of using multiple connections.
-
+
In practice, we can luckily take advantage of the knowledge that most FUSE requests are
the result of (synchronous) syscalls from userspace that will block until the
corresponding FUSE response has been sent.
-
+
If -o sshfs_sync is used, SSHFS always waits for the SFTP server response before
returning a FUSE response to userspace. If userspace makes concurrent system calls,
there is no ordering guarantee in the first place, so we do not have to worry about
@@ -523,7 +523,7 @@ static struct fuse_opt sshfs_opts[] = {
/* For backwards compatibility */
SSHFS_OPT("cache=yes", dir_cache, 1),
SSHFS_OPT("cache=no", dir_cache, 0),
-
+
FUSE_OPT_KEY("writeback_cache=no", FUSE_OPT_KEY_DISCARD),
FUSE_OPT_KEY("unreliable_append", FUSE_OPT_KEY_DISCARD),
@@ -1073,7 +1073,7 @@ static struct conn* get_conn(const struct sshfs_file *sf,
if (sshfs.max_conns == 1)
return &sshfs.conns[0];
-
+
if (sf != NULL)
return sf->conn;
@@ -1906,7 +1906,7 @@ static void *sshfs_init(struct fuse_conn_info *conn,
// SFTP only supports 1-second time resolution
conn->time_gran = 1000000000;
-
+
return NULL;
}
@@ -2371,13 +2371,13 @@ static int sshfs_mkdir(const char *path, mode_t mode)
// Commutes with pending write(), so we can use any connection
err = sftp_request(get_conn(NULL, NULL), SSH_FXP_MKDIR, &buf, SSH_FXP_STATUS, NULL);
buf_free(&buf);
-
+
if (err == -EPERM) {
if (sshfs.op->access(path, R_OK) == 0) {
return -EEXIST;
}
}
-
+
return err;
}
@@ -2394,7 +2394,7 @@ static int sshfs_mknod(const char *path, mode_t mode, dev_t rdev)
// Commutes with pending write(), so we can use any connection
conn = get_conn(NULL, NULL);
-
+
buf_init(&buf, 0);
buf_add_path(&buf, path);
buf_add_uint32(&buf, SSH_FXF_WRITE | SSH_FXF_CREAT | SSH_FXF_EXCL);
@@ -2532,7 +2532,7 @@ static int sshfs_rename(const char *from, const char *to, unsigned int flags)
}
pthread_mutex_unlock(&sshfs.lock);
}
-
+
return err;
}
@@ -2589,12 +2589,12 @@ static int sshfs_chmod(const char *path, mode_t mode,
buf_init(&buf, 0);
if (sf == NULL)
buf_add_path(&buf, path);
- else
+ else
buf_add_buf(&buf, &sf->handle);
-
+
buf_add_uint32(&buf, SSH_FILEXFER_ATTR_PERMISSIONS);
buf_add_uint32(&buf, mode);
-
+
/* FIXME: really needs LSETSTAT extension (debian Bug#640038) */
// Commutes with pending write(), so we can use any connection
// if the file is not open.
@@ -2618,7 +2618,7 @@ static int sshfs_chown(const char *path, uid_t uid, gid_t gid,
if (!sshfs_file_is_conn(sf))
return -EIO;
}
-
+
if (sshfs.remote_uid_detected) {
if (uid == sshfs.local_uid)
uid = sshfs.remote_uid;
@@ -2635,7 +2635,7 @@ static int sshfs_chown(const char *path, uid_t uid, gid_t gid,
buf_init(&buf, 0);
if (sf == NULL)
buf_add_path(&buf, path);
- else
+ else
buf_add_buf(&buf, &sf->handle);
buf_add_uint32(&buf, SSH_FILEXFER_ATTR_UIDGID);
buf_add_uint32(&buf, uid);
@@ -2685,7 +2685,7 @@ static int sshfs_utimens(const char *path, const struct timespec tv[2],
buf_init(&buf, 0);
if (sf == NULL)
buf_add_path(&buf, path);
- else
+ else
buf_add_buf(&buf, &sf->handle);
buf_add_uint32(&buf, SSH_FILEXFER_ATTR_ACMODTIME);
buf_add_uint32(&buf, asec);
@@ -2740,7 +2740,7 @@ static int sshfs_open_common(const char *path, mode_t mode,
if (fi->flags & O_APPEND)
pflags |= SSH_FXF_APPEND;
-
+
sf = g_new0(struct sshfs_file, 1);
list_init(&sf->write_reqs);
pthread_cond_init(&sf->write_finished, NULL);
@@ -2750,7 +2750,7 @@ static int sshfs_open_common(const char *path, mode_t mode,
pthread_mutex_lock(&sshfs.lock);
sf->modifver= sshfs.modifver;
if (sshfs.max_conns > 1) {
- ce = g_hash_table_lookup(sshfs.conntab, path);
+ ce = g_hash_table_lookup(sshfs.conntab, path);
if (!ce) {
ce = g_malloc(sizeof(struct conntab_entry));
ce->refcount = 0;
@@ -3354,7 +3354,7 @@ static int sshfs_truncate(const char *path, off_t size,
sshfs_inc_modifver();
if (sshfs.truncate_workaround)
return sshfs_truncate_workaround(path, size, fi);
-
+
buf_init(&buf, 0);
if (sf != NULL)
@@ -3397,7 +3397,7 @@ static int sshfs_getattr(const char *path, struct stat *stbuf,
buf_add_buf(&buf, &sf->handle);
err = sftp_request(sf->conn, SSH_FXP_FSTAT, &buf,
SSH_FXP_ATTRS, &outbuf);
- }
+ }
if (!err) {
err = buf_get_attrs(&outbuf, stbuf, NULL);
#ifdef __APPLE__
diff --git a/sshfs.rst b/sshfs.rst
index 711cc83..371a657 100644
--- a/sshfs.rst
+++ b/sshfs.rst
@@ -190,17 +190,17 @@ Options
directory cache holds the names of directory entries. Enabling it
allows `readdir(3)` system calls to be processed without network
access.
-
+
-o dcache_max_size=N
sets the maximum size of the directory cache.
-
+
-o dcache_timeout=N
sets timeout for directory cache in seconds.
-
+
-o dcache_{stat,link,dir}_timeout=N
sets separate timeout for {attributes, symlinks, names} in the
directory cache.
-
+
-o dcache_clean_interval=N
sets the interval for automatic cleaning of the directory cache.
@@ -209,17 +209,17 @@ Options
when full.
-o direct_io
- This option disables the use of page cache (file content cache) in
+ This option disables the use of page cache (file content cache) in
the kernel for this filesystem.
This has several affects:
1. Each read() or write() system call will initiate one or more read or
write operations, data will not be cached in the kernel.
- 2. The return value of the read() and write() system calls will correspond
- to the return values of the read and write operations. This is useful
+ 2. The return value of the read() and write() system calls will correspond
+ to the return values of the read and write operations. This is useful
for example if the file size is not known in advance (before reading it).
- e.g. /proc filesystem
+ e.g. /proc filesystem
-o max_conns=N
sets the maximum number of simultaneous SSH connections
diff --git a/test/appveyor-build.sh b/test/appveyor-build.sh
index dcf7800..da4e01e 100755
--- a/test/appveyor-build.sh
+++ b/test/appveyor-build.sh
@@ -1,4 +1,5 @@
#!/bin/bash
+set -e
machine=$(uname -m)
mkdir "build-$machine"
diff --git a/test/lint.sh b/test/lint.sh
new file mode 100755
index 0000000..5418df5
--- /dev/null
+++ b/test/lint.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+set -e
+pip3 install --user pre-commit
+pre-commit run --all-files --show-diff-on-failure
diff --git a/test/meson.build b/test/meson.build
index 3229a6c..c0edde2 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -2,7 +2,7 @@ test_scripts = [ 'conftest.py', 'pytest.ini', 'test_sshfs.py',
'util.py' ]
custom_target('test_scripts', input: test_scripts,
output: test_scripts, build_by_default: true,
- command: ['cp', '-fPp',
+ command: ['cp', '-fPp',
'@INPUT@', meson.current_build_dir() ])
# Provide something helpful when running 'ninja test'
diff --git a/test/test_sshfs.py b/test/test_sshfs.py
index 71cbd7f..1724555 100755
--- a/test/test_sshfs.py
+++ b/test/test_sshfs.py
@@ -35,15 +35,15 @@ def name_generator(__ctr=[0]):
@pytest.mark.parametrize("sync_rd", (True, False))
@pytest.mark.parametrize("multiconn", (True,False))
def test_sshfs(tmpdir, debug, cache_timeout, sync_rd, multiconn, capfd):
-
+
# Avoid false positives from debug messages
#if debug:
# capfd.register_output(r'^ unique: [0-9]+, error: -[0-9]+ .+$',
# count=0)
- # Avoid false positives from storing key for localhost
+ # Avoid false positives from storing key for localhost
capfd.register_output(r"^Warning: Permanently added 'localhost' .+", count=0)
-
+
# Test if we can ssh into localhost without password
try:
res = subprocess.call(['ssh', '-o', 'KbdInteractiveAuthentication=no',
@@ -80,12 +80,12 @@ def test_sshfs(tmpdir, debug, cache_timeout, sync_rd, multiconn, capfd):
if multiconn:
cmdline += [ '-o', 'max_conns=3' ]
-
+
new_env = dict(os.environ) # copy, don't modify
# Abort on warnings from glib
new_env['G_DEBUG'] = 'fatal-warnings'
-
+
mount_process = subprocess.Popen(cmdline, env=new_env)
try:
wait_for_mount(mount_process, mnt_dir)
@@ -299,7 +299,7 @@ def tst_link(mnt_dir, cache_timeout):
# we need to wait until the cached value has expired.
if cache_timeout:
safe_sleep(cache_timeout)
-
+
fstat1 = os.lstat(name1)
fstat2 = os.lstat(name2)
for attr in ('st_mode', 'st_dev', 'st_uid', 'st_gid',
diff --git a/test/travis-build.sh b/test/travis-build.sh
index c33f7dc..aa72cb2 100755
--- a/test/travis-build.sh
+++ b/test/travis-build.sh
@@ -6,36 +6,40 @@ set -e
# that we still need to fix
export ASAN_OPTIONS="detect_leaks=0"
-export LSAN_OPTIONS="suppressions=$(pwd)/test/lsan_suppress.txt"
+export LSAN_OPTIONS="suppressions=${PWD}/test/lsan_suppress.txt"
export CC
TEST_CMD="python3 -m pytest --maxfail=99 test/"
# Standard build with Valgrind
for CC in gcc clang; do
+ (
mkdir "build-${CC}"; cd "build-${CC}"
if [ "${CC}" == 'gcc-6' ]; then
build_opts='-D b_lundef=false'
else
build_opts=''
fi
+ # shellcheck disable=SC2086
meson -D werror=true ${build_opts} ../
ninja
TEST_WITH_VALGRIND=true ${TEST_CMD}
- cd ..
+ )
done
(cd "build-${CC}"; sudo ninja install)
# Sanitized build
CC=clang
for san in undefined address; do
- mkdir "build-${san}"; cd "build-${san}"
+ (
+ mkdir "build-${san}"
+ cd "build-${san}"
# b_lundef=false is required to work around clang
# bug, cf. https://groups.google.com/forum/#!topic/mesonbuild/tgEdAXIIdC4
meson -D b_sanitize=${san} -D b_lundef=false -D werror=true ..
ninja
${TEST_CMD}
sudo ninja install
- cd ..
+ )
done
diff --git a/test/util.py b/test/util.py
index cde0255..261a1c6 100644
--- a/test/util.py
+++ b/test/util.py
@@ -29,7 +29,7 @@ def cleanup(mount_process, mnt_dir):
mount_process.wait(1)
except subprocess.TimeoutExpired:
mount_process.kill()
-
+
def umount(mount_process, mnt_dir):
subprocess.check_call(['fusermount3', '-z', '-u', mnt_dir ])