Jonathan Sandoval [Thu, 7 Apr 2016 16:55:45 +0000 (11:55 -0500)]
Test with short and long username
Andrew Browning [Sun, 3 Apr 2016 05:10:22 +0000 (01:10 -0400)]
Import messages in blog views
Andrew Browning [Sat, 2 Apr 2016 01:14:40 +0000 (21:14 -0400)]
Fix #5451 - add_message inconsistencies
Reformat add_message function calls for consistency and PEP8 line
continuations.
Berker Peksag [Sat, 2 Apr 2016 17:48:04 +0000 (20:48 +0300)]
Replace raw_input with six.moves.input
Fixes #5441
宋文武 [Sat, 2 Apr 2016 03:45:25 +0000 (11:45 +0800)]
Fix the blog_delete page for admins.
* mediagoblin/media_types/blog/views.py: Import WARNING from mediagoblin.messages.
Christopher Allan Webber [Tue, 29 Mar 2016 21:41:57 +0000 (14:41 -0700)]
tests: Fix migration tests; foundations are now installed separately
* mediagoblin/tests/test_sql_migrations.py: Import migration.changeset
even in python 3.
(FOUNDATIONS): Removed.
(test_set1_to_set3): Removed foundations checks.
Christopher Allan Webber [Tue, 29 Mar 2016 21:24:59 +0000 (14:24 -0700)]
tests: importorskip migration tests on "migrate" rather than on Python 3
Previously we assumed we wouldn't run migration tests if we're on
Python 3, but now that we support sqlalchemy-migrate with Python 3,
switch to checking based on "migrate" importability.
* mediagoblin/tests/test_sql_migrations.py: Update test skipping to
rely on "migrate" module presence rather than Python 3 check.
Christopher Allan Webber [Tue, 29 Mar 2016 21:26:03 +0000 (14:26 -0700)]
Now on MediaGoblin 1.0 development cycle!
* configure.ac (AC_INIT):
* mediagoblin/_version.py (__version__): Update version to 1.0.dev.
Christopher Allan Webber [Tue, 29 Mar 2016 19:06:44 +0000 (12:06 -0700)]
devtools: Update maketarball.sh to use #!/bin/sh as shebang
* devtools/maketarball.sh: Updated shebang.
Christopher Allan Webber [Tue, 29 Mar 2016 19:04:37 +0000 (19:04 +0000)]
Committing extracted and compiled translations
Christopher Allan Webber [Tue, 29 Mar 2016 19:00:28 +0000 (12:00 -0700)]
devtools: Use pybabel in virtualenv or on path depending on which is present.
* devtools/update_translations.sh (PYBABEL): New variable, points to
whichever pybabel we should use.
Christopher Allan Webber [Tue, 29 Mar 2016 18:59:31 +0000 (11:59 -0700)]
guix: Add additional useful packages for development
* guix-env.scm: Added openssh, git, and rsync in the development package.
Christopher Allan Webber [Tue, 29 Mar 2016 18:47:02 +0000 (11:47 -0700)]
devtools: Switching "#!/usr/bin/env bash" -> "#!/bin/sh" again
This makes things easier on Guix and etc. We don't need Bash
specifically, just something Bourne-compatible, which all Posix
machines should theoretically provide.
* devtools/update_translations.sh: Updated shebang.
Christopher Allan Webber [Tue, 29 Mar 2016 18:42:20 +0000 (11:42 -0700)]
On MediaGoblin 0.9.0!
* configure.ac (AC_INIT):
* mediagoblin/_version.py (__version__): Update to 0.9.0.
Christopher Allan Webber [Tue, 29 Mar 2016 18:30:26 +0000 (11:30 -0700)]
doc: 0.9.0 release notes
* doc/source/siteadmin/relnotes.rst: Add release notes for 0.9.0.
Christopher Allan Webber [Tue, 29 Mar 2016 17:11:11 +0000 (10:11 -0700)]
AUTHORS: Adding new 0.9.0 contributors.
* AUTHORS: Adding new contributors
Christopher Allan Webber [Tue, 29 Mar 2016 16:44:34 +0000 (09:44 -0700)]
migrations: Only don't import "migrate" if it's not available
* mediagoblin/db/migrations.py: Import migrate if available; if not
print a warning.
Christopher Allan Webber [Sat, 26 Mar 2016 18:37:52 +0000 (11:37 -0700)]
doc: Update developer migration docs for Alembic as primary migration system
* docs/source/devel/migrations.rst: Update to reflect sqlalchemy-migrate
as being deprecated and Alembic as being the new way of doing
migrations.
Christopher Allan Webber [Fri, 25 Mar 2016 23:21:58 +0000 (16:21 -0700)]
Update make_example_database.sh to use #!/bin/sh instead of #!/usr/bin/env
* devtools/make_example_database.sh: Update shebang.
Christopher Allan Webber [Fri, 25 Mar 2016 22:47:19 +0000 (15:47 -0700)]
doc: Update plugins documentation in light of alembic branching usage
* docs/source/siteadmin/plugins.rst:
Added a reminder to run "./bin/gmg dbupdate" after installing a plugin.
Added a new "Deactivating plugins" section.
Renamed "Removing plugins" to "Removing plugin packages".
Christopher Allan Webber [Fri, 25 Mar 2016 22:26:07 +0000 (15:26 -0700)]
dbupdate: Correctly handle plugin foundations
* mediagoblin/gmg_commands/dbupdate.py (run_foundations):
When adding a plugin's foundations, correctly append both
the name and the foundations in a tuple to the list.
This prevents errors.
Christopher Allan Webber [Fri, 25 Mar 2016 22:07:36 +0000 (15:07 -0700)]
doc: Note that plugin authors must NEVER modify tables they don't control
* docs/source/pluginwriter/database.rst: New paragraph.
Christopher Allan Webber [Fri, 25 Mar 2016 20:38:58 +0000 (13:38 -0700)]
Update database docs for plugin authors for new alembic branching world
Things have gotten both easier and more complex in the branching world
view. Plugins branch off of main with their own migrations.
Generating these has become a bit easier, but the steps for doing this
are a bit wordy to explain.
* docs/source/pluginwriter/database.rst: Update both the
"Creating new Tables" and "Changing the Database Schema Later"
sections accordingly.
Christopher Allan Webber [Fri, 25 Mar 2016 00:13:34 +0000 (17:13 -0700)]
Add comment questioning why run_dbupdate is needed in get_app test utility
* mediagoblin/tests/tools.py (get_app): Add comment
Christopher Allan Webber [Fri, 25 Mar 2016 00:12:16 +0000 (17:12 -0700)]
Fix tests post-alembic-migration-changes.
* mediagoblin/init/__init__.py (setup_database): Update to run alembic
migrations, skip the old legacy migrations.
Christopher Allan Webber [Sat, 12 Mar 2016 23:46:02 +0000 (15:46 -0800)]
Only run archivalook migration if the tables aren't there.
Standard for anything existing before the Alembic move-over, but I
forgot this one.
* mediagoblin/plugins/archivalook/migrations/b10b5f822789_archivalook_plugin_initial_migration.py
(upgrade): Add has_table check, skip if such a table already exists.
Christopher Allan Webber [Sat, 12 Mar 2016 23:39:41 +0000 (15:39 -0800)]
Archivalook plugin initial migration.
* mediagoblin/plugins/archivalook/migrations/b10b5f822789_archivalook_plugin_initial_migration.py:
New file.
Christopher Allan Webber [Sat, 12 Mar 2016 23:36:41 +0000 (15:36 -0800)]
OpenID plugin initial migration.
* mediagoblin/plugins/openid/migrations/071abb33d1da_openid_plugin_initial_migration.py:
New file.
Christopher Allan Webber [Sat, 12 Mar 2016 23:35:38 +0000 (15:35 -0800)]
Persona plugin initial migration.
* mediagoblin/plugins/persona/migrations/c7d4840a5592_persona_plugin_initial_migration.py:
New file.
Christopher Allan Webber [Sat, 12 Mar 2016 23:22:52 +0000 (15:22 -0800)]
Blog media type initial migration.
* mediagoblin/media_types/blog/migrations/562bc42a8fff_blog_media_type_initial_migration.py:
New file.
Christopher Allan Webber [Sat, 12 Mar 2016 23:14:24 +0000 (15:14 -0800)]
PDF media type initial migration.
* mediagoblin/media_types/pdf/migrations/faa209f143b5_pdf_media_type_initial_migration.py:
New file.
Christopher Allan Webber [Sat, 12 Mar 2016 23:04:22 +0000 (15:04 -0800)]
STL media type initial migration.
* mediagoblin/media_types/stl/migrations/16134ed134ad_stl_media_type_initial_migration.py:
New file.
Christopher Allan Webber [Sat, 12 Mar 2016 22:53:20 +0000 (14:53 -0800)]
Ascii media type initial migration.
* mediagoblin/db/migrations/versions/72bd70f7eefd_ascii_media_type_initial_migration.py:
New file.
Christopher Allan Webber [Sat, 12 Mar 2016 22:52:09 +0000 (14:52 -0800)]
Video media type initial migration.
* mediagoblin/media_types/video/migrations/38feb829c545_video_media_type_initial_migration.py:
New file.
Christopher Allan Webber [Sat, 12 Mar 2016 22:51:20 +0000 (14:51 -0800)]
Audio media type initial migration.
* mediagoblin/media_types/audio/migrations/e9212d3a12d3_adding_audio_media_type_initial_.py:
New file.
Christopher Allan Webber [Sat, 12 Mar 2016 22:36:23 +0000 (14:36 -0800)]
Image media type initial migration.
* mediagoblin/media_types/image/migrations/a98c1a320e88_image_media_type_initial.py:
New file.
Christopher Allan Webber [Sat, 12 Mar 2016 22:38:43 +0000 (14:38 -0800)]
Removing erronously installed print statement.
* mediagoblin/gmg_commands/alembic_commands.py (FudgedCommandLine.main):
Removed call to print.
Christopher Allan Webber [Sat, 12 Mar 2016 19:30:08 +0000 (11:30 -0800)]
Allow for passing in --with-plugins to the alembic gmg subcommand.
This allows plugin writers to easily take advantage off alembic's migration
autogeneration support.
* mediagoblin/gmg_commands/alembic_commands.py: Adjusted imports.
(FudgedCommandLine.main, parser_setup): Add support for importing
plugins when --with-plugins is passed in.
Christopher Allan Webber [Sat, 12 Mar 2016 17:45:28 +0000 (09:45 -0800)]
Only run sqlalchemy-migrate migrations if we have to; separate foundations
The goal is to get things to the point where Alembic can run on its own
for new databases and initialize the whole database on its own. There
are risks to not doing so, see #5413 for details.
There's a lot more here that could removed or cleaned up once
sqlalchemy-migrate is *completely* removed in the future.
* mediagoblin/db/migration_tools.py (MigrationManager.foundations):
Removed attribute.
(MigrationManager.populate_table_foundations): Removed method.
(MigrationManager.init_or_migrate): Removed call to deprecated method.
(populate_table_foundations): New function, refactored from former
MigrationManager method of same name.
* mediagoblin/gmg_commands/dbupdate.py: Import populate_table_foundations.
(DatabaseData.foundations): Remove attribute.
(DatabaseData.make_migration_manager): Adjust instantiation of
MigrationManager.
(gather_database_data): Move out the work of building up foundations data.
(run_foundations): New method, incorporating logic for gathering and
running foundations which was previously spread across other
functions and methods.
(run_alembic_migrations): Remove deprecated comment.
(run_dbupdate): Only run sqlalchemy migrations if we have to.
Also run run_foundations if we are setting up this database for the
first time.
(sqam_migrations_to_run): New method.
Christopher Allan Webber [Sat, 12 Mar 2016 17:32:56 +0000 (09:32 -0800)]
Switch initial_revision alembic migration to make tables if they aren't there
This is a necessary step towards deprecating sqlalchemy-migrate.
* mediagoblin/db/migrations/versions/52bf0ccbedc1_initial_revision.py
(upgrade): Update for adding tables. Mostly generated via Alembic's
autogenerate tools.
(downgrade): Added a comment.
Christopher Allan Webber [Fri, 11 Mar 2016 19:54:12 +0000 (11:54 -0800)]
Set target_metadata in alembic's env.py to Base.metadata
This allows us to make use of automatically generated migrations, at
least for core.
* mediagoblin/db/migrations/env.py (target_metadata): Switch to gmg's
Base.metadata.
Christopher Allan Webber [Wed, 9 Mar 2016 23:16:17 +0000 (15:16 -0800)]
Update out script.py mako template to support branch_labels
This is important (probably) for long-running plugin branches.
* mediagoblin/db/migrations/script.py.mako: Updated to upstream
Alembic version of this file.
Christopher Allan Webber [Wed, 9 Mar 2016 21:31:39 +0000 (13:31 -0800)]
dbupdate updates to use plugin migrations if available
This makes use of the recently added "build_alembic_config" tool and
removes AlembicMigrationManager.
* mediagoblin/db/migration_tools.py (AlembicMigrationManager): Removed.
* mediagoblin/gmg_commands/dbupdate.py (run_alembic_migrations):
Adjusted to use recently added build_alembic_config tool.
Christopher Allan Webber [Wed, 9 Mar 2016 20:20:36 +0000 (12:20 -0800)]
Ignore .eggs/ directory
Christopher Allan Webber [Sun, 6 Mar 2016 01:37:58 +0000 (17:37 -0800)]
Add build_alembic_config, use it to add plugin migrations to alembic config
Christopher Allan Webber [Thu, 24 Mar 2016 21:23:49 +0000 (14:23 -0700)]
guix-env.scm: Comment on python-numpy pulling in texlive
textlive-texmf is currently a dependency of texlive in Guix, and is
very large. Users may want to know and disable this dependency, if
they can bear limiting the media types they are developing with.
* guix-env.scm: New comment on returned package.
Christopher Allan Webber [Tue, 23 Feb 2016 23:14:29 +0000 (15:14 -0800)]
Remove requirement that audio/video dependencies must be installed for tests
Some tests were added for running audio and video submission tests in
test_submission.py. Unfortunately these were not skipped if these
dependencies were not installed. This patch attempts to fix that while
leaving the tests intact.
Boris Bobrov [Fri, 11 Mar 2016 21:34:15 +0000 (00:34 +0300)]
Merge branch 'master' of git.sv.gnu.org:/srv/git/mediagoblin
Christopher Allan Webber [Wed, 9 Mar 2016 20:05:31 +0000 (12:05 -0800)]
Add python-gst to guix-env.scm
Boris Bobrov [Wed, 9 Mar 2016 09:28:14 +0000 (12:28 +0300)]
Check all tags for existence before using them
Fix bug 5401
Boris Bobrov [Tue, 8 Mar 2016 14:12:49 +0000 (17:12 +0300)]
Fix module name for `gmg alembic` command
gmg_commands.alembic attempted to import from `alembic`. On python2.7
it resulted in import from itself.
Rename alembic.py to alembic_commands.py and fix references to
gmg_commands.alembic.
Boris Bobrov [Tue, 8 Mar 2016 14:23:15 +0000 (17:23 +0300)]
Check tags for existence before using them
Closes bug 5401
Andrew Browning [Mon, 7 Mar 2016 00:47:17 +0000 (19:47 -0500)]
Fix #5440 - Typo in blog views
Christopher Allan Webber [Sun, 6 Mar 2016 00:28:30 +0000 (16:28 -0800)]
Commentary on where this hack on detecting no subcommand to Alembic comes from
Andrew Browning [Sat, 5 Mar 2016 16:58:23 +0000 (11:58 -0500)]
Fix comment ID links on blog media page
Change the comment ID behaviour and source of
user_pages/blog_media.html to match user_pages/media.html as of #5376.
Andrew Browning [Wed, 2 Mar 2016 18:37:36 +0000 (13:37 -0500)]
Fix comment ID links on media comment report page
Change the comment ID behaviour and source of user_pages/report.html
to match user_pages/media.html as of #5376.
Christopher Allan Webber [Thu, 3 Mar 2016 01:03:04 +0000 (17:03 -0800)]
Add "gmg raw_alembic" command.
This allows you to dispatch to the "alembic" command line tool properly,
but properly respecting MediaGoblin's own configuration.
Christopher Allan Webber [Thu, 3 Mar 2016 00:08:12 +0000 (16:08 -0800)]
typo fix: Set sqlalchemy.url, not qlalchemy.url
Christopher Allan Webber [Wed, 2 Mar 2016 19:18:25 +0000 (11:18 -0800)]
Remove old hack to support pre-0.7.5 Alembic versions
Thanks to Jessica Tallon for pointing out this TODO and its associated
hack could be removed.
Christopher Allan Webber [Wed, 2 Mar 2016 19:13:42 +0000 (11:13 -0800)]
Remove version caps on sqlalchemy and alembic.
Code seems to pass fine after the cap is removed. Whatever dependency
issues we were running into before don't seem to be an issue now.
Andrew Browning [Wed, 2 Mar 2016 17:43:53 +0000 (12:43 -0500)]
Fix #5432 - Comment report link doens't work
This builds on work done for #5376 and associates the correct comment
ID with comment report links.
Andrew Browning [Wed, 2 Mar 2016 17:29:33 +0000 (12:29 -0500)]
Fix #5435 - Bad comment links cause server error
This patch addresses an issue where a server error is caused by
entering a non-existent comment ID in a media URL.
Jessica Tallon [Tue, 1 Mar 2016 11:58:38 +0000 (11:58 +0000)]
Fix #5376 - Ensure links have correct ID
This ensures that links to comments have the correct ID (the
ID of the Comment object) as well as fixing deletion on reports
and fixing a few other little things. I hope this fixes the #5376
issue, though cannot reproduce so unable to confirm.
Andrew Browning [Tue, 1 Mar 2016 06:00:14 +0000 (01:00 -0500)]
Fix #5433 - Typo in decorators
Andrew Browning [Tue, 1 Mar 2016 05:27:50 +0000 (00:27 -0500)]
Fix #5431 - Typo in models
Fix a typo in models.py.
Jessica Tallon [Mon, 29 Feb 2016 19:18:42 +0000 (19:18 +0000)]
Fixes #5421 - Ensures Report.object_id is nullable
It seems there was a commit for a while where the migration was
making Report.object_id NOT NULL and this caused an errror when
a report deleted the associated object (media). This migrtion
checks it's nullable and if not, alters it so it is.
Jessica Tallon [Mon, 29 Feb 2016 19:04:44 +0000 (19:04 +0000)]
Migration for #5415 - I forgot it, Doh!
Jessica Tallon [Mon, 29 Feb 2016 18:17:42 +0000 (18:17 +0000)]
Fix a typo in consolidate_reports migration
Jessica Tallon [Mon, 29 Feb 2016 14:35:30 +0000 (14:35 +0000)]
Fix #5415 - Deleted comments get removed properly when tombstones
The original wrapper existed and should be been removed, this fix
now ensures the TextComment removes the Comment wrapper to prevent
the deleted (comments which are tombstones) existing.
Jessica Tallon [Mon, 29 Feb 2016 15:34:14 +0000 (15:34 +0000)]
Simply for the Notification.object_id migration
Jessica Tallon [Mon, 29 Feb 2016 14:26:05 +0000 (14:26 +0000)]
Missing perens
Jessica Tallon [Mon, 29 Feb 2016 14:14:58 +0000 (14:14 +0000)]
Fixed issue introduced in previous migration
Jessica Tallon [Mon, 29 Feb 2016 12:03:41 +0000 (12:03 +0000)]
Change Notification.object_id to be ID of Comemnt not TextComment
This shouldn't really effect much but it is a needed change for the future
this changes the Notification.object_id to be the ID of the Comment (the link
table to the comment object) rather than TextComment (the comment object itself).
This is needed as now comments can be other things, other than TextComment.
Christopher Allan Webber [Thu, 25 Feb 2016 23:41:03 +0000 (15:41 -0800)]
No need for python-chardet in guix-env.scm
That was *already* upstream in guix!
Christopher Allan Webber [Thu, 25 Feb 2016 23:38:28 +0000 (15:38 -0800)]
Email debug mode on Python 3 was printing bytestring representation for subject body
There's nothing useful about seeing b'foo\nbar\nbaz' printing to
stdout. That's not what the user should get!
Christopher Allan Webber [Thu, 25 Feb 2016 19:14:33 +0000 (11:14 -0800)]
guix-env.scm: Remove python-paste and python-pastescript, add python-chardet
python-paste and python-pastescript are now part of Guix proper.
Working on getting python-chardet there as well.
Christopher Allan Webber [Thu, 25 Feb 2016 02:05:03 +0000 (18:05 -0800)]
Crediting iyzsong
Christopher Allan Webber [Thu, 25 Feb 2016 02:04:09 +0000 (18:04 -0800)]
Fix sturm (Ben Sturmfels)' attribution
Christopher Allan Webber [Thu, 25 Feb 2016 01:54:34 +0000 (17:54 -0800)]
Fix ascii media type for Python 3. Fix by 宋文武 (iyzsong)
Christopher Allan Webber [Thu, 25 Feb 2016 01:52:15 +0000 (17:52 -0800)]
Oops, I forgot to include test_mgoblin_app_pdf.ini
Christopher Allan Webber [Wed, 24 Feb 2016 21:44:52 +0000 (13:44 -0800)]
Also switch "#!/usr/bin/env bash" to "#!/bin/sh" in compile-translations.sh
Christopher Allan Webber [Wed, 24 Feb 2016 21:44:10 +0000 (13:44 -0800)]
Add guix-env.scm to launch a Guix environment for hacking.
(Thanks to David Thompson for help on the MediaGoblin packaging, which
went into this a lot!)
Boris Bobrov [Tue, 23 Feb 2016 01:15:06 +0000 (04:15 +0300)]
Change viewitems to items
There is no viewitems in python3
Boris Bobrov [Tue, 23 Feb 2016 01:03:27 +0000 (04:03 +0300)]
do not show error message when it's not a exception
Gah, the previous patch was not enough! We cannot use text, we can only
use exception with a special attribute.
Lets return safe None for now an resolve this properly later, when we're
not in the freeze.
Boris Bobrov [Tue, 23 Feb 2016 00:57:00 +0000 (03:57 +0300)]
Catch import error when text is used as a reason instead of path
fail_error was used in import, but due to some changes text could appear
there and it caused an error.
There is little sense now to remove these text messages because they are
probably in databases already, so just ignore import errors.
Andrew Browning [Tue, 23 Feb 2016 00:15:40 +0000 (19:15 -0500)]
Fix issue #5411 sqlite connection closes
This update changes migrations to wrap db.execute results in a list to
keep the connection from closing for sqlite migrations.
Andrew Browning [Sun, 21 Feb 2016 22:49:53 +0000 (17:49 -0500)]
Fix issue 5422 Resend verification fails
If a user was logged in and already verified, the resend_verification
link would cause a server error. This fix addresses that by using the
correct syntax to query the username from the request.
Christopher Allan Webber [Sat, 20 Feb 2016 21:25:45 +0000 (13:25 -0800)]
Oh, we don't need Paste, but we do need PasteScript!
Christopher Allan Webber [Sat, 20 Feb 2016 20:44:42 +0000 (12:44 -0800)]
Basic explaination of how to deploy with Python 3.
Could be better, but "works" for now.
Christopher Allan Webber [Fri, 19 Feb 2016 19:51:20 +0000 (11:51 -0800)]
Move Ubuntu -> *buntu because of absurd trademark issues
For more context, see:
http://joeyh.name/blog/entry/trademark_nonsense/
Christopher Allan Webber [Thu, 18 Feb 2016 02:06:32 +0000 (18:06 -0800)]
Removing python 2.6 junk: argparse and a 2.6 classifier
Christopher Allan Webber [Thu, 18 Feb 2016 01:39:32 +0000 (17:39 -0800)]
Switch from Paste for serving to Waitress
Incredibly, it looks like none of our documentation has to change taking
this route...!
Boris Bobrov [Thu, 18 Feb 2016 06:42:24 +0000 (09:42 +0300)]
Cleanup setup.py
Remove old comments and duplicate requirements from setup.py
Christopher Allan Webber [Wed, 17 Feb 2016 23:52:24 +0000 (15:52 -0800)]
Removed deprecated comment about wsgi environ being borked
Christopher Allan Webber [Thu, 11 Feb 2016 22:47:04 +0000 (14:47 -0800)]
Fix another python 3 and unicode issue
Christopher Allan Webber [Thu, 11 Feb 2016 19:36:05 +0000 (11:36 -0800)]
Fixing one more bytes vs string battle in Python 3
Christopher Allan Webber [Thu, 11 Feb 2016 19:21:44 +0000 (11:21 -0800)]
#5416: Fix tests using the FileObjectAwareFile
Boris Bobrov [Thu, 21 Jan 2016 19:26:39 +0000 (22:26 +0300)]
Upgrade sqlalchemy and sa-migrate
Our versions were too old. And not compatible with python3.
Christopher Allan Webber [Thu, 11 Feb 2016 18:26:51 +0000 (10:26 -0800)]
Move "/usr/bin/env bash" to simply "/bin/sh"
This makes working with Guix easier.
Christopher Allan Webber [Thu, 11 Feb 2016 18:23:06 +0000 (10:23 -0800)]
.iteritems() doesn't exist in Python 3, converted to .items()