From 9b80a5ddb81644c17005cd846416fe0f7ae6f7b9 Mon Sep 17 00:00:00 2001 From: David Cantrell Date: Tue, 3 Dec 2019 13:15:58 -0500 Subject: [PATCH] Support --exclude-from for rsync publishing using excludes.txt Add an excludes.txt example file where users can list rsync exclude specifications. If the site you are publishing has any paths on the remote site that Pelican should ignore and not remove, list them in excludes.txt so they are not removed each time you do: make rsync_upload The example file has a comment pointing users to the rsync man page for information on the format used in exclude files. The only entry in it by default is the .DS_Store entry which was from the rsync command in tasks.py. --- pelican/tools/pelican_quickstart.py | 27 +++++++++++++++++++-- pelican/tools/templates/Makefile.jinja2 | 2 +- pelican/tools/templates/excludes.txt.jinja2 | 4 +++ pelican/tools/templates/tasks.py.jinja2 | 2 +- 4 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 pelican/tools/templates/excludes.txt.jinja2 diff --git a/pelican/tools/pelican_quickstart.py b/pelican/tools/pelican_quickstart.py index 77657162..0eb031a5 100755 --- a/pelican/tools/pelican_quickstart.py +++ b/pelican/tools/pelican_quickstart.py @@ -391,8 +391,31 @@ needed by Pelican. render_jinja_template("publishconf.py.jinja2", CONF, "publishconf.py") if automation: - render_jinja_template("tasks.py.jinja2", CONF, "tasks.py") - render_jinja_template("Makefile.jinja2", CONF, "Makefile") + try: + with open(os.path.join(CONF['basedir'], 'tasks.py'), + 'w', 'utf-8') as fd: + _template = _jinja_env.get_template('tasks.py.jinja2') + fd.write(_template.render(**CONF)) + fd.close() + except OSError as e: + print('Error: {0}'.format(e)) + try: + with open(os.path.join(CONF['basedir'], 'Makefile'), + 'w', 'utf-8') as fd: + py_v = 'python3' + _template = _jinja_env.get_template('Makefile.jinja2') + fd.write(_template.render(py_v=py_v, **CONF)) + fd.close() + except OSError as e: + print('Error: {0}'.format(e)) + try: + with open(os.path.join(CONF['basedir'], 'excludes.txt'), + 'w', 'utf-8') as fd: + _template = _jinja_env.get_template('excludes.txt.jinja2') + fd.write(_template.render(**CONF)) + fd.close() + except OSError as e: + print('Error: {0}'.format(e)) print("Done. Your new project is available at {}".format(CONF["basedir"])) diff --git a/pelican/tools/templates/Makefile.jinja2 b/pelican/tools/templates/Makefile.jinja2 index 67571b47..b7d7812d 100644 --- a/pelican/tools/templates/Makefile.jinja2 +++ b/pelican/tools/templates/Makefile.jinja2 @@ -132,7 +132,7 @@ sftp_upload: publish {% set upload = upload + ["rsync_upload"] %} rsync_upload: publish - rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --include tags --cvs-exclude --delete "$(OUTPUTDIR)"/ "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)" + rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --include tags --cvs-exclude --exclude-from=excludes.txt --delete $(OUTPUTDIR)/ $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) {% endif %} {% if dropbox %} diff --git a/pelican/tools/templates/excludes.txt.jinja2 b/pelican/tools/templates/excludes.txt.jinja2 new file mode 100644 index 00000000..fbf831ca --- /dev/null +++ b/pelican/tools/templates/excludes.txt.jinja2 @@ -0,0 +1,4 @@ +# Files to exclude with rsync(1) during publishing. +# See the INCLUDE/EXCLUDE PATTERN RULES section of the rsync man page. + +.DS_Store diff --git a/pelican/tools/templates/tasks.py.jinja2 b/pelican/tools/templates/tasks.py.jinja2 index 26af6f0d..a20f93e3 100644 --- a/pelican/tools/templates/tasks.py.jinja2 +++ b/pelican/tools/templates/tasks.py.jinja2 @@ -169,7 +169,7 @@ def publish(c): """Publish to production via rsync""" pelican_run("-s {settings_publish}".format(**CONFIG)) c.run( - 'rsync --delete --exclude ".DS_Store" -pthrvz -c ' + 'rsync --delete --exclude-from=excludes.txt -pthrvz -c ' '-e "ssh -p {ssh_port}" ' "{} {ssh_user}@{ssh_host}:{ssh_path}".format( CONFIG["deploy_path"].rstrip("/") + "/", **CONFIG