From d54c7ecbd618afb4df524e0d96dec7fe7cc2935d Mon Sep 17 00:00:00 2001 From: Cam Cope Date: Mon, 30 Aug 2021 07:35:33 -0700 Subject: [PATCH] Fixup whitespace and configure CI to keep it that way --- .pre-commit-config.yaml | 14 ++++++++++++++ .travis.yml | 18 ++++++++++++++---- ChangeLog.rst | 14 +++++++------- README.rst | 2 +- cache.c | 12 ++++++------ make_release_tarball.sh | 1 - meson.build | 3 +-- sshfs.c | 40 ++++++++++++++++++++-------------------- sshfs.rst | 16 ++++++++-------- test/appveyor-build.sh | 1 + test/lint.sh | 4 ++++ test/meson.build | 2 +- test/test_sshfs.py | 12 ++++++------ test/travis-build.sh | 12 ++++++++---- test/util.py | 2 +- 15 files changed, 92 insertions(+), 61 deletions(-) create mode 100644 .pre-commit-config.yaml create mode 100755 test/lint.sh diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..81501523 --- /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 b19fd560..cbd3963e 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 ae0fd101..b68be949 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 801846c4..825e0486 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 403c251c..9436c5a7 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 02095b68..8c17abe6 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 299d051a..ec6f9b4c 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 32130e11..8addecbb 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 711cc83c..371a6573 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 dcf78002..da4e01ea 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 00000000..5418df54 --- /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 3229a6c8..c0edde2d 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 71cbd7ff..1724555d 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 c33f7dc1..aa72cb2c 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 cde02556..261a1c68 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 ])