docs: def s3_upload(self, keyname, absolute_path):
          """
          Upload a file to s3
          """
          mimetype = mimetypes.guess_type(absolute_path)
          options = {'Content-Type': mimetype[0]}
  
          if mimetype[0] is not None and mimetype[0].startswith('text/'):
              upload = open(absolute_path, 'rb')
              options['Content-Encoding'] = 'gzip'
              key_parts = keyname.split('/')
              filename = key_parts.pop()
              temp_path = os.path.join(self.tempdir, filename)
              gzfile = gzip.GzipFile(temp_path, 'wb', 9, None, GZIP_TIMESTAMP)
              gzfile.write(upload.read())
              gzfile.close()
              absolute_path = temp_path
  
          hash = '"{0}"'.format(hashlib.md5(open(absolute_path, 'rb').read()).hexdigest())
          key = "{0}/{1}".format(self.bucket.path, keyname)
          existing = self.connection.get_key(key)
  
          if self.force or not existing or (existing.etag != hash):
              k = Key(self.connection)
              k.key = key
              puts("+ Uploading {0}/{1}".format(self.bucket, keyname))
              k.set_contents_from_filename(absolute_path, options, policy='public-read')
          else:
              puts("- Skipping  {0}/{1}, files match".format(self.bucket, keyname))