about summary refs log tree commit diff stats
path: root/.github
Commit message (Collapse)AuthorAgeFilesLines
* Actions: Add on pull_request againtoonn2021-07-243-0/+12
| | | | | | | | | | | | | | | My testing was flawed. The status checks seemed to work fine because the builds were triggered on push in the same repo. But this doesn't work across repos. So GH Actions having run to completion on someone's fork doesn't give us the status checks we need. Therefore we want to run our Actions on PRs too, that way they're run from the ranger repo as well and the status checks should actually be informative. One possible improvement is that we could duplicate the workflows we want to run on PRs, that way we can drop all the things that don't really matter for status checks from the version matrices. Otoh that means we have pretty much duplicated workflows we need to keep in sync. Thank you for your lack of abstractions, GH Actions 🙄
* Actions: Check whether on_pullrequest is necessarytoonn2021-07-203-12/+0
|
* Actions: Reduce tested versions to oldest and newesttoonn2021-07-203-4/+4
|
* Actions: Fix Python and Pypy paths filterstoonn2021-07-202-3/+3
|
* Actions: Drop on_pullrequest from Pypytoonn2021-07-201-6/+2
| | | | | We need to get it passing first before we can make it a useful status check on PRs.
* Actions: Fix pylint and Pypy paths filtertoonn2021-07-202-4/+4
|
* Actions: Drop Pypy from pylint and add pylint to Pypytoonn2021-07-202-2/+2
|
* Actions: Update shellcheck required actionstoonn2021-07-201-3/+1
|
* Actions: Refine Pypy versions and titletoonn2021-07-201-2/+2
|
* Actions: Separate pypy tests because they failtoonn2021-07-203-2/+36
|
* Actions: Update, incorporate and splittoonn2021-07-203-41/+38
| | | | | | Update the required actions. Incorporate doctest and manpage_completion test in the test action and separate pylint because it doesn't work with as many python versions.
* Actions: Drop 3.5 from linting because of old pylinttoonn2021-07-201-1/+1
|
* Actions: Set TERM=dumb to avoid tput warningstoonn2021-07-202-0/+4
|
* Actions: Try to fix missing terminfotoonn2021-07-201-0/+1
|
* Actions: Add on pull_request to get status checkstoonn2021-07-203-3/+11
| | | | | | This should enable the pylint, pytest, flake8 and shellcheck lints to run when PRs are opened and have them act as status checks so PRs aren't merged without them passing.
* Fix shellcheck version commenttoonn2021-01-051-1/+1
|
* Fix shellcheck download urltoonn2021-01-051-1/+1
|
* Document expected failure of GH Actiontoonn2020-07-051-1/+1
| | | | | | | Github Actions don't support some of our tests, due to `ncurses`. This Action fails intentionally so it might get fixed once we figure it out. If we invert the failure condition to "make CI green" we might forget about it.
* Clarify excluded tests for github workflowtoonn2020-07-052-3/+3
| | | | | Add pytest to the failing workflow because otherwise it's not run with python 2.7.
* Prepare for Pylint transition from versions <2toonn2020-07-053-34/+4
|
* Seperate doctests and pyteststoonn2019-09-242-2/+32
| | | | | | Doctests are interfering with CI because curses can't find the terminfo database. This'll require looking into but for now we'll run the doctests seperately and expect failure. Same thing for pytests.
* Segregate python 3.7 workflowtoonn2019-09-181-0/+30
| | | | | | By seperating the python 3.7 workflow we can keep an eye on changed linting errors for the newer pylint. Without cancelling the actions for our current setup.
* Drop py3.7toonn2019-09-181-1/+1
| | | | | Temporarily drop python 3.7 from the workflow because it's not compatible with `pylint<2`.
* Add GitHub Actions citoonn2019-09-032-0/+52
| | | | | | | | | | Run our python tests and shellcheck in seperate workflows only when relevant files are changed, respectively python files or `scope.sh`. This tests with one extra version of python, 3.7. GitHub's version of shellcheck seems to be missing a few flags. So we download the latest stable version, 0.7.0 currently.
* ISSUE_TEMPLATE: remove redundant linehut2017-12-301-2/+0
|
* ISSUE_TEMPLATE.md: consistent quote usagehut2017-12-301-1/+1
|
* Simplified github issue templatehut2017-12-301-38/+23
|
* core.main: `--version`: Report Python version and localenfnty2017-02-192-0/+4
| | | | | | Makes issue reporting easier. Fixes #812
* GitHub issue templates: Minor reorder and rewordingnfnty2017-01-172-6/+6
|
* GitHub issue templates: Add terminal emulatornfnty2017-01-162-6/+8
|
* GitHub issue templates: Reorder and improve editabilitynfnty2017-01-162-49/+62
|
* GitHub issue templates: Add extra spacesnfnty2017-01-162-11/+18
|
* Added GitHub issue templatesnfnty2017-01-162-0/+76
|
* Revert "Add github issue/PR templates"hut2016-08-272-14/+0
| | | | This reverts commit 0757fe98dcb238133dcac664c972bdecb7b78b65.
* Add github issue/PR templateshut2016-08-272-0/+14
span class="n">write(line[2:]) elif len(line) > 0 and '*' in arg.list_tagged_files: sys.stdout.write(line) return 1 if arg.fail_unless_cd else 0 SettingsAware._setup(clean=arg.clean) if arg.selectfile: arg.selectfile = os.path.abspath(arg.selectfile) arg.targets.insert(0, os.path.dirname(arg.selectfile)) targets = arg.targets or ['.'] target = targets[0] if arg.targets: if target.startswith('file://'): target = target[7:] if not os.access(target, os.F_OK): print("File or directory doesn't exist: %s" % target) return 1 elif os.path.isfile(target): def print_function(string): print(string) from ranger.ext.rifle import Rifle fm = FM() if not arg.clean and os.path.isfile(fm.confpath('rifle.conf')): rifleconf = fm.confpath('rifle.conf') else: rifleconf = fm.relpath('config/rifle.conf') rifle = Rifle(rifleconf) rifle.reload_config() rifle.execute(targets, number=ranger.arg.mode, flags=ranger.arg.flags) return 1 if arg.fail_unless_cd else 0 crash_traceback = None try: # Initialize objects fm = FM() FileManagerAware.fm = fm fm.tabs = dict((n+1, os.path.abspath(path)) for n, path \ in enumerate(targets[:9])) load_settings(fm, arg.clean) if arg.list_unused_keys: from ranger.ext.keybinding_parser import (special_keys, reversed_special_keys) maps = fm.ui.keymaps['browser'] for key in sorted(special_keys.values(), key=lambda x: str(x)): if key not in maps: print("<%s>" % reversed_special_keys[key]) for key in range(33, 127): if key not in maps: print(chr(key)) return 1 if arg.fail_unless_cd else 0 if fm.username == 'root': fm.settings.preview_files = False fm.settings.use_preview_script = False if not arg.debug: from ranger.ext import curses_interrupt_handler curses_interrupt_handler.install_interrupt_handler() if arg.selectfile: fm.select_file(arg.selectfile) # Run the file manager fm.initialize() fm.ui.initialize() if arg.cmd: for command in arg.cmd: fm.execute_console(command) if ranger.arg.profile: import cProfile import pstats profile = None ranger.__fm = fm cProfile.run('ranger.__fm.loop()', '/tmp/ranger_profile') profile = pstats.Stats('/tmp/ranger_profile', stream=sys.stderr) else: fm.loop() except Exception: import traceback crash_traceback = traceback.format_exc() except SystemExit as error: return error.args[0] finally: if crash_traceback: try: filepath = fm.thisfile.path if fm.thisfile else "None" except: filepath = "None" try: fm.ui.destroy() except (AttributeError, NameError): pass if ranger.arg.profile and profile: profile.strip_dirs().sort_stats('cumulative').print_callees() if crash_traceback: print("ranger version: %s, executed with python %s" % (ranger.__version__, sys.version.split()[0])) print("Locale: %s" % '.'.join(str(s) for s in locale.getlocale())) try: print("Current file: %s" % filepath) except: pass print(crash_traceback) print("ranger crashed. " \ "Please report this traceback at:") print("http://savannah.nongnu.org/bugs/?group=ranger&func=additem") return 1 return 0 def parse_arguments(): """Parse the program arguments""" from optparse import OptionParser from os.path import expanduser from ranger import CONFDIR, USAGE, VERSION from ranger.ext.openstruct import OpenStruct if 'XDG_CONFIG_HOME' in os.environ and os.environ['XDG_CONFIG_HOME']: default_confdir = os.environ['XDG_CONFIG_HOME'] + '/ranger' else: default_confdir = CONFDIR parser = OptionParser(usage=USAGE, version=VERSION) parser.add_option('-d', '--debug', action='store_true', help="activate debug mode") parser.add_option('-c', '--clean', action='store_true', help="don't touch/require any config files. ") parser.add_option('--copy-config', type='string', metavar='which', help="copy the default configs to the local config directory. " "Possible values: all, rc, rifle, commands, options, scope") parser.add_option('--fail-unless-cd', action='store_true', help="experimental: return the exit code 1 if ranger is" \ "used to run a file (with `ranger filename`)") parser.add_option('-r', '--confdir', type='string', metavar='dir', default=default_confdir, help="the configuration directory. (%default)") parser.add_option('-m', '--mode', type='int', default=0, metavar='n', help="if a filename is supplied, run it with this mode") parser.add_option('-f', '--flags', type='string', default='', metavar='string', help="if a filename is supplied, run it with these flags.") parser.add_option('--choosefile', type='string', metavar='TARGET', help="Makes ranger act like a file chooser. When opening " "a file, it will quit and write the name of the selected " "file to TARGET.") parser.add_option('--choosefiles', type='string', metavar='TARGET', help="Makes ranger act like a file chooser for multiple files " "at once. When opening a file, it will quit and write the name " "of all selected files to TARGET.") parser.add_option('--choosedir', type='string', metavar='TARGET', help="Makes ranger act like a directory chooser. When ranger quits" ", it will write the name of the last visited directory to TARGET") parser.add_option('--list-unused-keys', action='store_true', help="List common keys which are not bound to any action.") parser.add_option('--selectfile', type='string', metavar='filepath', help="Open ranger with supplied file selected.") parser.add_option('--list-tagged-files', type='string', default=None, metavar='tag', help="List all files which are tagged with the given tag, default: *") parser.add_option('--profile', action='store_true', help="Print statistics of CPU usage on exit.") parser.add_option('--cmd', action='append', type='string', metavar='COMMAND', help="Execute COMMAND after the configuration has been read. " "Use this option multiple times to run multiple commands.") options, positional = parser.parse_args() arg = OpenStruct(options.__dict__, targets=positional) arg.confdir = expanduser(arg.confdir) return arg def load_settings(fm, clean): from ranger.core.actions import Actions import ranger.core.shared import ranger.api.commands from ranger.config import commands # Load default commands fm.commands = ranger.api.commands.CommandContainer() exclude = ['settings'] include = [name for name in dir(Actions) if name not in exclude] fm.commands.load_commands_from_object(fm, include) fm.commands.load_commands_from_module(commands) if not clean: allow_access_to_confdir(ranger.arg.confdir, True) # Load custom commands try: import commands fm.commands.load_commands_from_module(commands) except ImportError: pass # Load rc.conf custom_conf = fm.confpath('rc.conf') default_conf = fm.relpath('config', 'rc.conf') load_default_rc = fm.settings.load_default_rc if load_default_rc: fm.source(default_conf) if os.access(custom_conf, os.R_OK): fm.source(custom_conf) # XXX Load plugins (experimental) try: plugindir = fm.confpath('plugins') plugins = [p[:-3] for p in os.listdir(plugindir) \ if p.endswith('.py') and not p.startswith('_')] except: pass else: if not os.path.exists(fm.confpath('plugins', '__init__.py')): f = open(fm.confpath('plugins', '__init__.py'), 'w') f.close() ranger.fm = fm for plugin in sorted(plugins): try: module = __import__('plugins', fromlist=[plugin]) fm.log.append("Loaded plugin '%s'." % module) except Exception as e: fm.log.append("Error in plugin '%s'" % plugin) import traceback for line in traceback.format_exception_only(type(e), e): fm.log.append(line) ranger.fm = None allow_access_to_confdir(ranger.arg.confdir, False) else: fm.source(fm.relpath('config', 'rc.conf')) def allow_access_to_confdir(confdir, allow): import sys from errno import EEXIST if allow: try: os.makedirs(confdir) except OSError as err: if err.errno != EEXIST: # EEXIST means it already exists print("This configuration directory could not be created:") print(confdir) print("To run ranger without the need for configuration") print("files, use the --clean option.") raise SystemExit() if not confdir in sys.path: sys.path[0:0] = [confdir] else: if sys.path[0] == confdir: del sys.path[0]