fix mail validation behavior

fix mail validation behavior

--- client/app/components/mails_input.coffee
+++ client/app/components/mails_input.coffee
@@ -204,12 +204,14 @@
     onBlur: ->
         # We must use a timeout, otherwise, when user click inside contact list,
         # blur is triggered first and the click event lost. Dirty hack
-        setTimeout @addContactFromInput, 100
+        setTimeout =>
+            @addContactFromInput true
+        , 100

     # Grab text from the input and ensure it's a valid email address.
     # If the address is valid, adds it to the recipient list.
-    addContactFromInput: ->
+    addContactFromInput: (isBlur=false) ->
         # if user cancel compose, component may be unmounted when the timeout
         # is fired
         if @isMounted()
@@ -232,7 +234,10 @@
                 else
                     # Trick to make sure that the alert error is not pop up
                     # twiced due to multiple blur and key down.
-                    unless @isShowingAlert
+                    # Do not display anything when the field is blurred.
+                    if not @isShowingAlert
+                    and @state.contacts.length is 0
+                    and not isBlur
                         @isShowingAlert = true
                         alert t('compose wrong email format',
                             address: address.address)


add horn config

add horn config

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/stevelacy/portal-rialu.git/'


Atom files

Atom files

error: pathspec 'atom.symlink/github.cson' did not match any file(s) known to git

--- atom.symlink/github.cson
+++ atom.symlink/github.cson
@@ -0,0 +1 @@
+# Store non-visible GitHub package state.


init file for loading mysql functions/procedures. delimiter not supported by node-mysql so not using currently.

error: pathspec 'queries/_init.coffee' did not match any file(s) known to git

--- queries/_init.coffee
+++ queries/_init.coffee
@@ -0,0 +1,30 @@
+# load functions and procs
+
+fs = require "fs"
+walk = require "walk"
+mysql = require "mysql"
+
+db = require "#{__dirname}/../config/db"
+
+connection = mysql.createConnection db
+connection.connect()
+
+load = ->
+
+  walker = walk.walk "#{__dirname}/support/", {}
+
+  walker.on "file", (root, stats, next) ->
+    source = "#{root}/#{stats.name}"
+    console.log "loading support file: #{source}"
+    fs.readFile source, 'utf8', (fsErr, queryBody) ->
+      console.log "fs err: ", fsErr if fsErr?
+      connection.query queryBody, (mysqlErr, rows, fields) ->
+        console.log "mysql err: ", mysqlErr if mysqlErr?
+
+        next()
+
+  walker.on "end", ->
+    console.log "Init Finished!"
+    connection.end()
+
+load()


bug fix

bug fix

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bubblegroup/bubblebot.git/'


don't recur through tasks folder

don't recur through tasks folder

--- app/templates/gulpfile.coffee
+++ app/templates/gulpfile.coffee
@@ -12,7 +12,7 @@
 global.isWatching = false
 global.browserSync = browserSync

-requireDir('./gulp', recurse: true)
+requireDir('./gulp/tasks', recurse: false)


specs for helper directive 'openExternal' added

error: pathspec 'test/unit/common/helper.spec.coffee' did not match any file(s) known to git

--- test/unit/common/helper.spec.coffee
+++ test/unit/common/helper.spec.coffee
@@ -0,0 +1,40 @@
+describe 'helper', ->
+
+  beforeEach module('hoay.helper')
+
+  describe 'openExternal directive', ->
+
+    it 'should be a valid directive', inject(($compile, $rootScope) ->
+      html = "<open-external url='http://websector.de'>WEBSECTOR.DE</open-external>"
+      expect( ->
+        $compile(html)($rootScope)
+      ).not.toThrow()
+    )
+
+    it 'should have _blank target by default', inject(($compile, $rootScope, $window) ->
+      url = "http://anyurl.com"
+      html = "<open-external url=#{url}>link</open-external>"
+      element = $compile(html)($rootScope)
+      scope = element.scope()
+      spy = sinon.spy $window, 'open'
+
+      scope.openUrl()
+      expect(spy.calledWith(url, '_blank')).toBeTruthy()
+      $window.open.restore()
+    )
+
+    it 'should have _system target for using Cordova', inject(($compile, $rootScope, $window) ->
+      url = "http://anyurl.com"
+      html = "<open-external url=#{url}>link</open-external>"
+      # Note: mocking cordova before calling $compile()
+      $window.cordova = {}
+      element = $compile(html)($rootScope)
+      scope = element.scope()
+      spy = sinon.spy $window, 'open'
+
+      scope.openUrl()
+      expect(spy.calledWith(url, '_system')).toBeTruthy()
+      $window.cordova = undefined
+    )
+
+


Add tweet bot

Add tweet bot

error: pathspec 'scripts/tweet.coffee' did not match any file(s) known to git

--- scripts/tweet.coffee
+++ scripts/tweet.coffee
@@ -0,0 +1,5 @@
+module.exports = (robot) ->
+
+  robot.hear /修論/i, (msg) ->
+    msg.send "ダメです"
+


added favicon to ignore in init.coffee

added favicon to ignore in init.coffee

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/pauljakobwhite/develephant-roots-template.git/'


add data initializer to cozy-todos

add data initializer to cozy-todos

error: pathspec 'init.coffee' did not match any file(s) known to git

--- init.coffee
+++ init.coffee
@@ -0,0 +1,74 @@
+server = require './server'
+async = require "async"
+
+DataTree = require("./common/tree/tree_object").Tree
+
+## Small script to intialize list of available applications.
+
+todolist = new TodoList
+    title: "Tutorial"
+    path: "/all/tutorial"
+    humanPath: "All,Tutorial"
+    tags: "all,tutorial"
+
+
+tasks = [
+    new Task
+        description: "When you hit enter in a task, it creates a new task line\
+just above"
+    new Task
+        description: "When you hit backspace in an empty task, it is deleted."
+    new Task
+        description: "Keyboard shortcut: ctrl+space change state of current\
+task"
+    new Task
+        description: "Keyboard shortcut: ctrl+up makes move up current task
+one row over."
+    new Task
+        description: "Keyboard shortcut: ctrl+down makes move down current\
+task from one above"
+    new Task
+        description: "Click on done button and task will be back to the todo\
+the todo state."
+    new Task
+        description: "Click on todo button and task will be archived and set\
+to done."
+    new Task
+        description: "Last button will display your have done list"
+    new Task
+        description: "magnifying glass button lets you find list"
+    new Task
+        description: "pencil button lets you rename selected list"
+    new Task
+        description: "x button lets you delete selected list"
+    new Task
+        description: "+ button lets you create a new todo list as child of \
+currenlty selected list"
+    ]
+
+saveFunc = (obj) ->
+    (callback) ->
+        obj.save callback
+
+
+TodoList.create todolist, (err, list) ->
+    if err
+        console.log err
+        console.log "Initialization failed (can't save todo-list)"
+        process.exit(0)
+
+    task.list = list.id for task in tasks
+    saveFuncs = (saveFunc(task) for task in tasks)
+    async.series saveFuncs, ->
+        Tree.getOrCreate (err, tree) ->
+            if err
+                console.log err
+                console.log "Initialization failed (cannot update tree)"
+                process.exit(0)
+            dataTree = new DataTree JSON.parse(tree.struct)
+            dataTree.addNode "/all", list.title, list.id
+
+            tree.updateAttributes struct: dataTree.toJson(), (err) ->
+                console.log "Initialization succeeds."
+                process.exit(0)
+


Add error message if refund fails

Add error message if refund fails

--- app/assets/javascripts/admin.js.coffee
+++ app/assets/javascripts/admin.js.coffee
@@ -139,6 +139,9 @@
             status.animate({
               backgroundColor: '#d9534f'
             }, 300, 'swing')
+            setTimeout(() ->
+              alert('Sorry, this payment could not be refunded. These funds may have already been released to you. If you have any questions, please contact team@crowdhoster.com with the payment ID.')
+            , 300)
           )
           .always(() ->
             loader.hide()


git-plus for Atom keymappings

git-plus for Atom keymappings

error: pathspec 'git-plus.cson' did not match any file(s) known to git

--- git-plus.cson
+++ git-plus.cson
@@ -0,0 +1,42 @@
+# Keybindings require three things to be fully defined: A selector that is
+# matched against the focused element, the keystroke and the command to
+# execute.
+#
+# Below is a basic keybinding which registers on all platforms by applying to
+# the root workspace element.
+
+# For more detailed documentation see
+# https://atom.io/docs/latest/advanced/keymaps
+
+'.platform-darwin':
+  #'cmd-shift-c': 'git-plus:commit'
+  #'cmd-shift-u': 'git-plus:pull'
+  'cmd-shift-a a': 'git-plus:add-all-commit'
+  'cmd-shift-a b': 'git-plus:branch'
+  'cmd-shift-a c': 'git-plus:commit'
+  'cmd-shift-a d': 'git-plus:diff'
+  'cmd-shift-a l': 'git-plus:log'
+  'cmd-shift-a m': 'git-plus:menu'
+  'cmd-shift-a n': 'git-plus:checkout'
+  'cmd-shift-a p': 'git-plus:add-all-commit-and-push'
+  'cmd-shift-a r': 'git-plus:run'
+  'cmd-shift-a s': 'git-plus:status'
+  'cmd-shift-a t': 'git-plus:tags'
+  'cmd-shift-a u': 'git-plus:pull'
+
+'.platform-win32, .platform-linux':
+  'ctrl-shift-h': 'git-plus:menu'
+  'ctrl-shift-x': 'git-plus:commit'
+  'ctrl-shift-a s': 'git-plus:status'
+  'ctrl-shift-a q': 'git-plus:add-and-commit-and-push'
+  'ctrl-shift-a a': 'git-plus:add-all-and-commit'
+  'ctrl-shift-a p': 'git-plus:add-all-commit-and-push'
+
+'.platform-darwin atom-text-editor':
+  'cmd-shift-a b': 'git-plus:branch'
+  #'cmd-shift-a': 'git-plus:add'
+  #'cmd-shift-a c': 'git-plus:add-and-commit'
+
+'.platform-win32 atom-text-editor, .platform-linux atom-text-editor':
+  'ctrl-shift-a': 'git-plus:add'
+  'ctrl-shift-a c': 'git-plus:add-and-commit'


Correct lint error in http/FrontEnd unit tests.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/RobotSnacks/stout-server.git/'


Add user.

Add user.

error: pathspec 'app/client/js/users/user.coffee' did not match any file(s) known to git

--- app/client/js/users/user.coffee
+++ app/client/js/users/user.coffee
@@ -0,0 +1,41 @@
+goog.provide 'app.User'
+
+class app.User
+
+  ###*
+    @param {Object=} json
+    @constructor
+  ###
+  constructor: (json) ->
+    goog.mixin @, json if json
+
+  ###*
+    @param {Object} json
+    @return {app.User}
+  ###
+  @fromFacebook: (json) ->
+    new app.User
+      email: json.email
+      id: 'facebook:' + json.id
+      name: json.name
+      providers: facebook: json
+
+  ###*
+    @type {string}
+  ###
+  email: ''
+
+  ###*
+    @type {string}
+  ###
+  id: ''
+
+  ###*
+    @type {string}
+  ###
+  name: ''
+
+  ###*
+    @type {Object}
+  ###
+  provider: null


Initial draft of Guts framework

Initial draft of Guts framework

error: pathspec 'guts.coffee' did not match any file(s) known to git

--- guts.coffee
+++ guts.coffee
@@ -0,0 +1,169 @@
+###
+#    Guts Framework for Backbone views
+###
+#
+# Handling subviews:
+# http://stackoverflow.com/questions/9337927/how-to-handle-initializing-and-rendering-subviews-in-backbone-js
+# Basic render strategy:
+# http://ianstormtaylor.com/rendering-views-in-backbonejs-isnt-always-simple/
+verbose = false
+
+handlebars_render = (template_name, context) ->
+  template = App.Handlebars[template_name]
+  if template
+    if verbose
+      console.log 'Rendering template \'' + template_name + '\''
+    output = template context
+    return output
+  else
+    throw 'handlebars_render : error : couldn\'t find template \'' + template_name + '\''
+
+render = handlebars_render
+
+# BasicModelView always updates and is therefore only OK for basic templates
+# that are not nested or involving forms.
+class BasicModelView extends Backbone.View
+    render: =>
+      context =
+        model: @model.toJSON()
+        cid: @model.cid
+        url: @model.url
+      template_result = render (@template or @options.template), context
+      # console.log 'BasicModelView : info : rendered "' + template_result + '"'
+      @$el.html(template_result)
+      @
+
+    initialize: =>
+      @render()
+      @listenTo @model, 'change', @render
+
+
+  class CompositeModelView extends Backbone.View
+    _rendered: false
+    render: =>
+      if @_rendered
+        # CompositeModelView should not need to render multiple times since it is
+        # associated with a model and not individual fields
+        return @
+
+      if not @model
+        throw 'CompositeModelView : error : model is not set'
+
+      @_rendered = true
+      context =
+        model: @model.toJSON()
+        cid: @model.cid
+        url: @model.url
+      template_result = render (@template or @options.template), context
+      @$el.html(template_result)
+      @
+
+    initialize: =>
+      @render()
+      for binding, view of _.result(@, 'child_views')
+        @[binding] = if typeof view is 'function' then view() else view
+
+  class CompositeModelForm extends CompositeModelView
+    rerender: =>
+      @_rendered = false
+      @render()
+
+    initialize: =>
+      super
+      @listenToOnce @model, 'change', @rerender
+
+    save: =>
+      @listenToOnce @model, 'sync', =>
+        if verbose
+          console.log 'save succeeded'
+      @model.save()
+
+    submitted: (e) =>
+      e.preventDefault()
+      @save
+
+    keyup: (e) =>
+      data = Backbone.Syphon.serialize(@)
+      @model.set data
+
+      if @timer
+        window.clearTimeout(@timer)
+      @timer = window.setTimeout @save, 2000
+
+    events: =>
+      'submit form': 'submitted'
+      'keyup input': 'keyup'
+
+
+  class ModelFieldView extends Backbone.View
+    render: =>
+      value = @options.model.get(@options.property)
+      context = {}
+      context[@options.property] = value
+      template_result = render (@template or @options.template), context
+      @$el.html(template_result)
+      @
+
+    initialize: (options) =>
+      if not (@template or @options.template)
+        @render = =>
+          value = @options.model.get(@options.property)
+          if value
+            if @options.unescaped
+              @$el.html(value)
+            else
+              @$el.html(_.escape value)
+          @
+      if @options.is_form_field
+        @listenToOnce @options.model, 'change:' + @options.property, @render
+      else
+        @render()
+        @listenTo @options.model, 'change:' + @options.property, @render
+
+  class ModelAttributeFieldView extends Backbone.View
+    render: =>
+      value = @options.model.get(@options.property)
+      if value
+        @$el.attr(@options.attribute, value)
+      @
+    initialize: (options) =>
+      if @options.is_form_field
+        @listenToOnce @options.model, 'change:' + @options.property, @render
+      else
+        @render()
+        @listenTo @options.model, 'change:' + @options.property, @render
+
+  class BaseCollectionView extends Backbone.View
+    initialize: (options) =>
+      if not options.item_view_class
+        throw 'BaseCollectionView : error : no item_view_class specified'
+      if not options.collection
+        throw 'BaseCollectionView : error : empty or no collection specified'
+
+      @_childViews = []
+      @collection.each @add
+
+      @listenTo @collection, 'add', @add
+      @listenTo @collection, 'remove', @remove
+
+    add: (model) =>
+      childView = new @options.item_view_class
+        model: model
+      @_childViews.push childView
+      @$el.append(childView.render().el)
+
+    remove: (model) =>
+      window.alert 'remove CALLED'
+      viewToRemove = (_(@_childViews).select (cv) => return cv.model == model )[0]
+      @_childViews = _(@_childViews).without(viewToRemove)
+      @$(viewToRemove.el).remove()
+
+# Export Guts
+class Guts
+  @BasicModelView:     BasicModelView
+  @CompositeModelView: CompositeModelView
+  @CompositeModelForm: CompositeModelForm
+  @BaseCollectionView: BaseCollectionView
+  @ModelFieldView:     ModelFieldView
+
+@Guts = Guts


Atom spellcheck in HTML as well

Atom spellcheck in HTML as well

--- atom.symlink/config.cson
+++ atom.symlink/config.cson
@@ -33,6 +33,7 @@
       "text.plain"
       "source.gfm"
       "text.git-commit"
+      "text.html.basic"
     ]
   welcome:
     showOnStartup: false


Logger function

Logger function

error: pathspec 'src/logger.coffee' did not match any file(s) known to git

--- src/logger.coffee
+++ src/logger.coffee
@@ -0,0 +1,44 @@
+###
+
+# Logger
+
+Outputs messages to the console.
+
+###
+'use strict'
+
+chalk = require('chalk')
+require 'sugar'
+
+exports.Logger = {
+  log: []
+  init: ()->
+    @log = []
+    return this
+  completed: ()->
+    return @log.join("\n")
+  append: (type, msg)->
+    entry = "[#{Date.create().format('{HH}:{mm}:{ss}')}] #{type} #{msg}"
+    @log.push chalk.stripColor(entry)
+    console.log entry
+  debug: (msg)->
+    @append chalk.bgWhite.black(" DEBUG "), msg
+  info: (msg)->
+    @append chalk.bgWhite.black(" INFO "), msg
+  error: (msg)->
+    @append chalk.bgRed.black(" ERROR "), msg
+  warn: (msg)->
+    @append chalk.bgYellow.black(" WARN "), msg
+  bot: (msg)->
+    @append chalk.bgGreen.white(" BOT "), msg
+  shell: (msg)->
+    @append chalk.bgBlue.white(" SHELL: "), ""
+    console.log msg
+  exec: (msg)->
+    @append chalk.bgBlue.white(" EXEC "), msg
+  stub: (msg)->
+    @append chalk.bgRed.black(" STUB "), msg
+  todo: (msg)->
+    @append chalk.bgRed.black(" TODO "), msg
+
+}.init()


added allow headers for refresh so that web bridge poller works

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/steroids.git/'


Fixing socket, preventing socket spawning

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/stevelacy/claru.git/'


Removed extraneous keymap.cson since inkdrop_keymap.cson duplicates it.

error: pathspec 'keymap.cson' did not match any file(s) known to git

--- keymap.cson
+++ keymap.cson
@@ -0,0 +1,8 @@
+'.CodeMirror.vim-mode.insert-mode textarea':
+  'ctrl-[': 'vim:exit-insert-mode'
+  'j k': 'vim:exit-insert-mode'
+  'k j': 'vim:exit-insert-mode'
+'.CodeMirror.vim-mode.replace-mode textarea':
+  'ctrl-[': 'vim:exit-insert-mode'
+  'j k': 'vim:exit-insert-mode'
+  'k j': 'vim:exit-insert-mode'


cleaning up passport

cleaning up passport


added a BaseMap class for shared methods

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/genericdave/speedr.js.git/'


missing test file

missing test file

error: pathspec 'test/myawt.coffee' did not match any file(s) known to git

--- test/myawt.coffee
+++ test/myawt.coffee
@@ -0,0 +1,9 @@
+_ = require 'underscore'
+{Transform} = require 'writable-stream-parallel'
+class MyAwesomeTransform extends Transform
+  constructor: (options) -> super _(options).extend { objectMode: true }
+  _transform: (chunk, enc, cb) =>
+    cb null, chunk + 10
+
+module.exports =
+  MyAwesomeTransform: MyAwesomeTransform


Remove assignment

Remove assignment

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/sstephenson/eve.git/'


Add cson-safe license override

Add cson-safe license override

--- build/tasks/license-overrides.coffee
+++ build/tasks/license-overrides.coffee
@@ -75,3 +75,37 @@

       LGPL
     """
+  'cson-safe@1.0.2'
+    license: 'BSD'
+    source: 'LICENSE in the repository'
+    sourceText: """
+      Copyright (c) 2014, Groupon, Inc.
+      All rights reserved.
+
+      Redistribution and use in source and binary forms, with or without
+      modification, are permitted provided that the following conditions
+      are met:
+
+      Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+      Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+      Neither the name of GROUPON nor the names of its contributors may be
+      used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+      IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+      TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+      PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+      HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+      SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+      TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+      PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+      LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+      NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+      SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+    """


Display warning if disk space is kind of full

--- build/tasks/output-disk-space.coffee
+++ build/tasks/output-disk-space.coffee
@@ -20,6 +20,6 @@
         if capacity > 90
           grunt.log.error("#{filesystem} is at #{capacity}% capacity!")
         else if capacity > 80
-          grunt.log.error("#{filesystem} is at #{capacity}% capacity.")
+          grunt.log.ok("#{filesystem} is at #{capacity}% capacity.")

       done()


Remove ConfigObserver from exports

Remove ConfigObserver from exports

--- exports/atom.coffee
+++ exports/atom.coffee
@@ -4,7 +4,6 @@
   _: require 'underscore-plus'
   BufferedNodeProcess: require '../src/buffered-node-process'
   BufferedProcess: require '../src/buffered-process'
-  ConfigObserver: require '../src/config-observer'
   Directory: require '../src/directory'
   File: require '../src/file'
   fs: require 'fs-plus'


Added index script to be exported

Added index script to be exported

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/renanhangai/servitude.git/'


missing space.

missing space.

--- src/scope.coffee
+++ src/scope.coffee
@@ -17,7 +17,7 @@
   # as well as a reference to the **Block** node is belongs to, which is
   # where it should declare its variables, and a reference to the function that
   # it wraps.
-  constructor:(@parent, @expressions, @method) ->
+  constructor: (@parent, @expressions, @method) ->
     @variables = [{name: 'arguments', type: 'arguments'}]
     @positions = {}
     Scope.root = this unless @parent


Finishes #409

Finishes #409

Mirror Event aliases for Model instances

--- src/spine.coffee
+++ src/spine.coffee
@@ -394,6 +394,9 @@
   unbind: ->
     @trigger('unbind')

+Model::on = Model::bind
+Model::off = Model::unbind
+
 class Controller extends Module
   @include Events
   @include Log


add localstorage support checker

add localstorage support checker

error: pathspec 'src/utils.coffee' did not match any file(s) known to git

--- src/utils.coffee
+++ src/utils.coffee
@@ -0,0 +1,10 @@
+supports_local_storage = ->
+  try
+    return "localStorage" of window and window.localStorage isnt null
+  catch e
+    console.log "no local storage support"
+    return false
+  return
+
+root = exports ? window
+root.supports_local_storage = supports_local_storage


General layout

General layout

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/C-Bouthoorn/Epsilon.git/'


Running tests on bigger servers

Running tests on bigger servers

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bubblegroup/bubblebot.git/'


bug fix

bug fix


fixes

fixes


Projects getting stuck in "building" state
and simplification of fading code

[Fixes #45015179]

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/CodeforHawaii/projectmonitor.git/'


added revKeys for fast removal in Map

added revKeys for fast removal in Map


buffer minIndex and maxIndex refactor

buffer minIndex and maxIndex refactor

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/zagushka/ui-scroll.git/'


Added new mail system

Added new mail system

error: pathspec 'mail.coffee' did not match any file(s) known to git

--- mail.coffee
+++ mail.coffee
@@ -0,0 +1,50 @@
+# Description:
+#   Mail System
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot mail <recipient> <message> - Sends a <message> to <recipient> when found available
+#
+# Author:
+#   MrSaints
+
+module.exports = (robot) ->
+    getMails = ->
+        robot.brain.data.mails or= {}
+
+    deliverMails = (context, recipient) ->
+        return unless robot.brain.data.mails?
+
+        recipient = recipient.toLowerCase()
+
+        if mails = getMails()[recipient]
+            for mail in mails
+                context.send "#{robot.brain.userForName(recipient).name}: [From #{mail[0]}] #{mail[1]}"
+            delete getMails()[recipient]
+
+    robot.respond /mail (\S+) (.+)/i, (msg) ->
+        [command, recipient, message] = msg.match
+        sender = msg.message.user.name
+
+        if recipient is robot.name
+            msg.reply "Thanks, but no thanks! I do not need any mail."
+
+        if recipient is sender
+            msg.reply "Are you sure you want to send a mail to yourself? Sad."
+
+        recipient = recipient.toLowerCase()
+
+        getMails()[recipient] or= []
+        getMails()[recipient].push [sender, message]
+        msg.reply "Your mail has been prepared for #{recipient}."
+
+    robot.enter (response) ->
+        deliverMails response, response.message.user.name
+
+    robot.hear /./i, (msg) ->
+        deliverMails msg, msg.message.user.name


Update configuration

Update configuration

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ehmicky/myos.git/'


Search completion; and even more minor tweaks.

--- pages/vomnibar.coffee
+++ pages/vomnibar.coffee
@@ -56,6 +56,7 @@
   hide: (@postHideCallback = null) ->
     UIComponentServer.postMessage "hide"
     @reset()
+    @completer?.reset()

   onHidden: ->
     @postHideCallback?()
@@ -175,8 +176,7 @@

     completion = suggestions[0].slice query.length, length

-    # Don't complete trailing whitespace; so, strip it.  Then, verify that the completion is still long
-    # enough.
+    # Don't complete trailing whitespace, strip it.  Then, verify that the completion is still long enough.
     completion = completion.replace /\s+$/, ""
     return unless 0 < completion.length

@@ -187,11 +187,9 @@
     @input.value = query + completion
     @input.setSelectionRange query.length, query.length + completion.length

-  #
   # Returns the user's action ("up", "down", "tab", "enter", "dismiss", "delete" or null) based on their
-  # keypress.
-  # We support the arrow keys and other shortcuts for moving, so this method hides that complexity.
-  #
+  # keypress.  We support the arrow keys and various other shortcuts for moving. This method hides that
+  # complexity.
   actionFromKeyEvent: (event) ->
     key = KeyboardUtils.getKeyChar(event)
     if (KeyboardUtils.isEscape(event))
@@ -245,7 +243,7 @@
         if @suppressedLeadingKeyword?
           # This is a custom search engine completion.  Because of the way we add and highlight the text
           # common to all completions in the input (selectCommonMatches), the text in the input might not
-          # correspond to any of the completions.  So we fire the query off to the background page and use the
+          # correspond to any of the completions.  So we fire off the query to the background page and use the
           # completion at the top of the list (which will be the right one).
           @update true, =>
             if @completions[0]
@@ -279,8 +277,9 @@
   onKeypress: (event) =>
     if @inputContainsASelectionRange()
       # As the user types characters which match a highlighted completion suggestion (in the text input), we
-      # suppress the keyboard event and "simulate" it by advancing the start of the highlighted selection.  We
-      # do this so that the selection doesn't flicker as the user types.
+      # suppress the keyboard event and "simulate" it by advancing the start of the highlighted selection (but
+      # only if the typed character matches).  This avoids flicker as the selection is first collapsed then
+      # replaced.
       if @input.value[@input.selectionStart][0].toLowerCase() == (String.fromCharCode event.charCode).toLowerCase()
         console.log "extend selection:", @getInputWithoutSelectionRange()
         @input.setSelectionRange @input.selectionStart + 1, @input.selectionEnd
@@ -293,7 +292,7 @@
   inputContainsASelectionRange: ->
     @input.selectionStart? and @input.selectionEnd? and @input.selectionStart != @input.selectionEnd

-  # Return the text of the input, with any selected text renage removed.
+  # Return the text of the input, with any selected text removed.
   getInputWithoutSelectionRange: ->
     if @inputContainsASelectionRange()
       @input.value[0...@input.selectionStart] + @input.value[@input.selectionEnd..]
@@ -301,7 +300,7 @@
       @input.value

   # Return the background-page query corresponding to the current input state.  In other words, reinstate any
-  # custom search engine keyword which is currently stripped from the input.
+  # search engine keyword which is currently stripped from the input, and strip any selection.
   getInputValueAsQuery: ->
     (if @suppressedLeadingKeyword? then @suppressedLeadingKeyword + " " else "") + @getInputWithoutSelectionRange()

@@ -337,15 +336,15 @@
     1 < queryTerms.length and queryTerms[0] in @keywords

   update: (updateSynchronously = false, callback = null) =>
-    # If the query text becomes a custom search, then we need to force a synchronous update (so that the
-    # interface is snappy).
+    # If the query text becomes a custom search (the user enters a search keyword), then we need to force a
+    # synchronous update (so that state is updated immediately).
     updateSynchronously ||= @isCustomSearch() and not @suppressedLeadingKeyword?
     if updateSynchronously
       @clearUpdateTimer()
       @updateCompletions callback
     else if not @updateTimer?
       # Update asynchronously for better user experience and to take some load off the CPU (not every
-      # keystroke will cause a dedicated update)
+      # keystroke will cause a dedicated update).
       @updateTimer = Utils.setTimeout @refreshInterval, =>
         @updateTimer = null
         @updateCompletions callback
@@ -376,14 +375,10 @@
 class BackgroundCompleter
   debug: true

-  # name is background-page completer to connect to: "omni", "tabs", or "bookmarks".
+  # The "name" is the background-page completer to connect to: "omni", "tabs", or "bookmarks".
   constructor: (@name) ->
     @port = chrome.runtime.connect name: "completions"
     @messageId = null
-    # @keywords and @cache are both reset in @reset().
-    # We only cache for the duration of a single vomnibar activation.
-    @keywords = []
-    @cache = {}
     @reset()

     @port.onMessage.addListener (msg) =>
@@ -393,17 +388,18 @@
           @lastUI.setKeywords @keywords
         when "completions"
           # The result objects coming from the background page will be of the form:
-          #   { html: "", type: "", url: "" }
+          #   { html: "", type: "", url: "", ... }
           # Type will be one of [tab, bookmark, history, domain, search], or a custom search engine description.
           for result in msg.results
-            result.performAction =
-              if result.type == "tab"
-                @completionActions.switchToTab.curry result.tabId
-              else
-                @completionActions.navigateToUrl.curry result.url
-
-          # Cache the result -- if we have been told it's ok to do so (it could be that more results will be
-          # posted shortly).  We cache the result even if it arrives late.
+            extend result,
+              performAction:
+                if result.type == "tab"
+                  @completionActions.switchToTab result.tabId
+                else
+                  @completionActions.navigateToUrl result.url
+
+          # Cache the results, but only if we have been told it's ok to do so (it could be that more results
+          # will be posted shortly).  We cache the results even if they arrive late.
           if msg.mayCacheResults
             console.log "cache set:", "-#{msg.cacheKey}-" if @debug
             @cache[msg.cacheKey] = msg
@@ -416,7 +412,7 @@
   filter: (query, @mostRecentCallback) ->
     queryTerms = query.trim().split(/\s+/).filter (s) -> 0 < s.length
     cacheKey = queryTerms.join " "
-    cacheKey += " " if 0 < queryTerms.length and queryTerms[0] in @keywords and /\s$/.test query
+    cacheKey += " " if queryTerms.length == 1 and queryTerms[0] in @keywords and /\s$/.test query

     if cacheKey of @cache
       console.log "cache hit:", "-#{cacheKey}-" if @debug
@@ -432,22 +428,20 @@
         cacheKey: cacheKey

   reset: ->
-    @keywords = []
-    @cache = {}
+    [ @keywords, @cache ] = [ [], {} ]

   refresh: (@lastUI) ->
     @reset()
-    # Inform the background completer that we have a new vomnibar activation.
     @port.postMessage name: @name, handler: "refresh"

   cancel: ->
     # Inform the background completer that it may (should it choose to do so) abandon any pending query
-    # (because the user is typing, and there'll be another query along soon).
+    # (because the user is typing, and there will be another query along soon).
     @port.postMessage name: @name, handler: "cancel"

   # These are the actions we can perform when the user selects a result.
   completionActions:
-    navigateToUrl: (url, openInNewTab) ->
+    navigateToUrl: (url) -> (openInNewTab) ->
       # If the URL is a bookmarklet (so, prefixed with "javascript:"), then we always open it in the current
       # tab.
       openInNewTab &&= not Utils.hasJavascriptPrefix url
@@ -456,7 +450,7 @@
         url: url
         selected: openInNewTab

-    switchToTab: (tabId) ->
+    switchToTab: (tabId) -> ->
       chrome.runtime.sendMessage handler: "selectSpecificTab", id: tabId

 UIComponentServer.registerHandler (event) ->


AceFindAndReplaceView: fix hide on escape handler issue

--- client/ace/lib/acefindandreplaceview.coffee
+++ client/ace/lib/acefindandreplaceview.coffee
@@ -38,6 +38,8 @@

   close: (fireEvent = yes) ->

+    $(window).off 'keydown.acefindview'
+
     @hide()
     @findInput.setValue    ''
     @replaceInput.setValue ''
@@ -47,6 +49,9 @@
   show: (withReplace) ->

     super
+
+    $(window).on 'keydown.acefindview', (event) =>
+      @close()  if event.which is 27

     cssName = 'with-replace-view'
     method  = if withReplace then 'setClass' else 'unsetClass'


Components: List: render Header only if there is a header to render

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Create anagram-detection.coffee

Create anagram-detection.coffee

error: pathspec 'anagram-detection/anagram-detection.coffee' did not match any file(s) known to git

--- anagram-detection/anagram-detection.coffee
+++ anagram-detection/anagram-detection.coffee
@@ -0,0 +1,69 @@
+# Simple function that will take a string of latin characters and return a unique hash
+hashString = (str) ->
+  # Map characters to prime numbers to multiply
+  charMap =
+    a: 2
+    b: 3
+    c: 5
+    d: 7
+    e: 11
+    f: 13
+    g: 17
+    h: 19
+    i: 23
+    j: 29
+    k: 31
+    l: 37
+    m: 41
+    n: 43
+    o: 47
+    p: 53
+    q: 59
+    r: 61
+    s: 67
+    t: 71
+    u: 73
+    v: 79
+    w: 83
+    x: 89
+    y: 97
+    z: 101
+    A: 103
+    B: 107
+    C: 109
+    D: 113
+    E: 127
+    F: 131
+    G: 137
+    H: 139
+    I: 149
+    J: 151
+    K: 163
+    L: 167
+    M: 173
+    N: 179
+    O: 181
+    P: 191
+    Q: 193
+    R: 197
+    S: 199
+    T: 211
+    U: 223
+    V: 227
+    W: 229
+    X: 233
+    Y: 239
+    Z: 241
+
+  str.split("").reduce ((memo, char) -> memo * charMap[char]), 1
+
+anagramDetection = (parent, child) ->
+  length = child.length
+  anagram = hashString(child)
+  total = 0
+  i = 0
+
+  while i < (parent.length - length)
+    total += 1  if hashString(parent.substr(i, length)) is anagram
+    i++
+  total


Refactor changeSection to avoid extra arguments

Scrolling to the top of a page is just another thing executed on hashchange now.

I found the call "changeSection null, !!e" and the "noscroll" argument to be a
bit confusing, and out of the proper scope.  This refactor avoids them.

--- app/assets/javascripts/main_form.js.coffee
+++ app/assets/javascripts/main_form.js.coffee
@@ -1,7 +1,7 @@
 if window.location.pathname.match(/\/apply$/)
   $ ->

-    changeSection = (e, noscroll)->
+    changeSection = ->
       hash = window.location.hash
       sectionId = hash.substring 1
       $('.section').each ()->
@@ -17,9 +17,12 @@
           parent.toggleClass 'active', true
         else
           parent.toggleClass 'active', false
-      window.scrollTo 0, 0 unless noscroll
+
+    scrollToTop = ->
+      window.scrollTo 0, 0

     $(window).on 'hashchange', changeSection
+    $(window).on 'hashchange', scrollToTop

     showDownloadWarning = ->
       $('#download-warning').modal()
@@ -36,7 +39,7 @@
       if window.location.hash.length <= 1
         window.location.hash = firstSectionHash
       else
-        changeSection null, !!e
+        changeSection()

     $(document).ajaxComplete initialize
     initialize()


Prevent duplicate names

Prevent duplicate names

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/nathan/lemma.git/'


add GitHub

add GitHub

error: pathspec 'scripts/github.coffee' did not match any file(s) known to git

--- scripts/github.coffee
+++ scripts/github.coffee
@@ -0,0 +1,118 @@
+# Description:
+#   Github management tools
+#
+# Dependencies:
+#   "githubot": "0.4.x"
+#
+# Configuration:
+#   HUBOT_GITHUB_TOKEN
+#   HUBOT_GITHUB_API
+#   HUBOT_GITHUB_REPOS_PATH
+#
+# Commands:
+#   hubot github show:issue <options> -- List issues for a repository
+#   hubot github create:issue <options> -- Create a issue for a repository
+#
+# Notes:
+#   HUBOT_GITHUB_API allows you to set a custom URL path (for Github enterprise users)
+#
+#   Options format exsample:
+#     hubot github create:issue title:issue-title body:awesome repo:owner/repo_name
+#
+# Author:
+#   yulii
+
+class CommandOption
+
+  constructor: (@args) ->
+    self = this
+    @params = {}
+    for field in @args.split(/\s+/)
+      o = self.parse(field)
+      @params[o.label] = o.value
+
+  parse: (field) ->
+    separatorIndex = field.indexOf(':');
+    l = field.slice(0, separatorIndex)
+    v = field.slice(separatorIndex + 1)
+    v = v.split(',') if v.indexOf(',') >= 0
+    { label: l, value: v }
+
+  data: () ->
+    args = Array.prototype.slice.call(arguments)
+    data = {}
+    for key of @params
+      data[key] = @params[key] if args.indexOf(key) >= 0
+    return data
+
+  query: () ->
+    args = Array.prototype.slice.call(arguments)
+    list = []
+    for key of @params
+      list.push("#{key}=#{@params[key]}") if args.indexOf(key) >= 0
+    return list.join("&")
+
+  get: (name) ->
+    @params[name]
+
+
+module.exports = (robot) ->
+
+  github = require("githubot")(robot)
+
+  unless (url_api_base = process.env.HUBOT_GITHUB_API)?
+    url_api_base = "https://api.github.com"
+
+  repos_path = process.env.HUBOT_GITHUB_REPOS_PATH
+
+  signature = (name) ->
+    "\n- Created by #{name} via Hubot"
+
+  ## List issues for a repository
+  robot.respond /github\s+show:issues?(\s+)?(.+)?/i, (msg) ->
+
+    option    = new CommandOption(msg.match[2])
+    repo_path = option.get('repo') ? repo_path
+
+    unless repo_path?
+      msg.send "No repository specified, please provide one or set HUBOT_GITHUB_REPOS_PATH accordingly."
+      return
+
+    url   = "#{url_api_base}/repos/#{repo_path}/issues"
+    query = option.query('milestone', 'state', 'assignee', 'creator', 'mentioned', 'labels', 'sort', 'direction', 'since')
+
+    github.get "#{url}?#{query}", (issues) ->
+      if issues.length == 0
+        summary = "Achievement unlocked: open issues zero!"
+      else
+        if issues.length == 1
+          summary = "There's only one open issue for #{repo_path}:"
+        else
+          summary = "I found #{issues.length} open issues for #{repo_path}:"
+
+        for issue in issues
+          summary = summary + "\n\t#{issue.title} (#{if issue.assignee then issue.assignee.login else 'no assignee'}) -> #{issue.html_url}"
+
+      msg.send summary
+
+  ## Create an issue
+  robot.respond /github\s+create:issue\s+(.+)/i, (msg) ->
+
+    option    = new CommandOption(msg.match[1])
+    repo_path = option.get('repo') ? repo_path
+
+    unless repo_path?
+      msg.send "No repository specified, please provide one or set HUBOT_GITHUB_REPOS_PATH accordingly."
+      return
+
+    url  = "#{url_api_base}/repos/#{repo_path}/issues"
+    data = option.data('title', 'body', 'assignee', 'milestone', 'labels')
+
+    data['body'] ?= ''
+    data['body']  = signature(msg.message.user.name)
+
+    github.post url, data, (issue) ->
+      console.log(issue)
+      msg.send "#{issue.title} (#{if issue.assignee then issue.assignee.login else 'no assignee'}) -> #{issue.html_url}"
+
+


Add new Area class for tracking retangular positions on the canvas

error: pathspec 'public/js/area.coffee' did not match any file(s) known to git

--- public/js/area.coffee
+++ public/js/area.coffee
@@ -0,0 +1,2 @@
+class App.Area
+	constructor: (@x, @y, @width, @height) ->


load on /profile/ also

load on /profile/ also

--- assets/misc.coffee
+++ assets/misc.coffee
@@ -32,6 +32,8 @@

   '/works-for-you': require('../apps/notifications/client/index.coffee').init

+  '/profile/.*': require('../apps/user/client/index.coffee').init
+
   '/user/.*': require('../apps/user/client/index.coffee').init

   '/search': require('../apps/search/client/index.coffee').init


snippet for Hapi

snippet for Hapi

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AlexKVal/dotfiles.git/'


don't bother trying to delete the AuthSession cookie from JS; it's http-only

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/UCSFMemoryAndAging/tabcat.git/'


do not remove access token on every error

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/rremizov/github-notifier.git/'


ApiGenerator: default definitions, better naming

--- scripts/api-generator.coffee
+++ scripts/api-generator.coffee
@@ -27,14 +27,14 @@
   ]

   definitions:
-    defaultSelector:
+    DefaultSelector:
       type: 'object'
       properties:
         _id:
           type: 'string'
           description: 'Mongo Object ID'
           example: '582c21d43bf248161538450b'
-    defaultResponse:
+    DefaultResponse:
       type: 'object'
       properties:
         ok:
@@ -51,7 +51,7 @@
           type: 'object'
           description: 'Result of the operation'
           example: "Hello World"
-    unauthorizedRequest:
+    UnauthorizedRequest:
       type: 'object'
       properties:
         status:
@@ -77,7 +77,7 @@
     bodyParam:
       in: 'body'
       name: 'body'
-      schema: $ref: '#/definitions/defaultSelector'
+      schema: $ref: '#/definitions/DefaultSelector'
       required: true
       description: 'body of the request'

@@ -145,7 +145,7 @@

   schema = if definitions[name]
   then { $ref: "#/definitions/#{name}" }
-  else { $ref: "#/definitions/defaultResponse" }
+  else { $ref: "#/definitions/DefaultResponse" }

   for method, signatures of methods.statik

@@ -162,10 +162,10 @@
         responses:
           '200':
             description: 'Request processed succesfully'
-            schema: $ref: "#/definitions/defaultResponse"
+            schema: $ref: "#/definitions/DefaultResponse"
           '401':
             description: 'Unauthorized request'
-            schema: $ref: '#/definitions/unauthorizedRequest'
+            schema: $ref: '#/definitions/UnauthorizedRequest'

   for method, signatures of methods.instance


Vende. For fucks sake.

Vende. For fucks sake.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Mikuia/Mikuia.git/'


Added resimulateSession method

Added resimulateSession method

--- server/queues/scoring.coffee
+++ server/queues/scoring.coffee
@@ -77,6 +77,27 @@
     async.each result, resimulateSession.bind(@,originalLevelID,levelMajorVersion), (err) ->
       if err? then return errors.serverError res, err
       sendResponseObject req, res, {"message":"All task pairs were succesfully sent to the queue"}
+
+resimulateSession = (originalLevelID, levelMajorVersion, session, cb) =>
+  sessionUpdateObject =
+    submitted: true
+    submitDate: new Date()
+    meanStrength: 25
+    standardDeviation: 25/3
+    totalScore: 10
+    numberOfWinsAndTies: 0
+    numberOfLosses: 0
+    isRanking: true
+  LevelSession.update {_id: session._id}, sessionUpdateObject, (err, updatedSession) ->
+    if err? then return cb err, null
+    opposingTeam = calculateOpposingTeam(session.team)
+    fetchInitialSessionsToRankAgainst opposingTeam, originalLevelID, levelMajorVersion, (err, sessionsToRankAgainst) ->
+      if err? then return cb err, null
+
+      taskPairs = generateTaskPairs(sessionsToRankAgainst, session)
+      sendEachTaskPairToTheQueue taskPairs, (taskPairError) ->
+        if taskPairError? then return cb taskPairError, null
+        cb null

 module.exports.createNewTask = (req, res) ->


Add new user celebration script

Add new user celebration script

error: pathspec 'scripts/newuserparty.coffee' did not match any file(s) known to git

--- scripts/newuserparty.coffee
+++ scripts/newuserparty.coffee
@@ -0,0 +1,25 @@
+# Description:
+# Create a party when a new user appear
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   new user - Create a party when a new user appear
+#
+# Author:
+#   PiXeL16
+
+emojis = [
+  ":tada::tada::smile::tada::tada:",
+  ":confetti_ball::tada::smile::tada::confetti_ball:",
+  ":tada::tada::metal::tada::tada:",
+]
+
+module.exports = (robot) ->
+
+  robot.hear /new user/i, (msg) ->
+    msg.send "A new user hooray!! " + msg.random emojis


Updated Daemon

Updated Daemon

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/iShafayet/nodemgr.git/'


support https - the default port for https is 443

--- lib/replay/proxy.coffee
+++ lib/replay/proxy.coffee
@@ -35,7 +35,9 @@
   constructor: (options = {}, @replay, @proxy)->
     @method = (options.method || "GET").toUpperCase()
     [host, port] = (options.host || options.hostname).split(":")
-    @url = URL.parse("#{options.protocol || "http:"}//#{host || "localhost"}:#{options.port || port || 80}#{options.path || "/"}")
+    protocol = options.protocol || "http:"
+    port = options.port || port || (if protocol == "https:" then 443 else 80)
+    @url = URL.parse("#{protocol}//#{host || "localhost"}:#{port}#{options.path || "/"}")
     @headers = {}
     if options.headers
       for n,v of options.headers


updating webserver example for node API

updating webserver example for node API

--- examples/web_server.coffee
+++ examples/web_server.coffee
@@ -3,7 +3,7 @@
 http: require 'http'

 server: http.createServer (req, res) ->
-  res.sendHeader 200, {'Content-Type': 'text/plain'}
+  res.writeHeader 200, {'Content-Type': 'text/plain'}
   res.write 'Hello, World!'
   res.close()


add Palette.clone()

add Palette.clone()

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/aligerum/umbriel.git/'


Index viewing test via casper.js

Index viewing test via casper.js

error: pathspec 'frontend/view_index.coffee' did not match any file(s) known to git

--- frontend/view_index.coffee
+++ frontend/view_index.coffee
@@ -0,0 +1,9 @@
+casper = require('casper').create()
+
+d = ->
+  console.log arguments...
+
+casper.start 'http://func', ->
+  this.test.assertHttpStatus 200
+
+casper.run()


:lipstick:

:lipstick:

--- spec/app/editor-spec.coffee
+++ spec/app/editor-spec.coffee
@@ -780,8 +780,6 @@
         expect(editor.find('.selection').length).toBe 3

   describe "cursor rendering", ->
-
-
     describe "when the cursor moves", ->
       charWidth = null


Bind meta-_ to zoom out in image view

Bind meta-_ to zoom out in image view

--- src/app/keymaps/editor.cson
+++ src/app/keymaps/editor.cson
@@ -41,4 +41,5 @@
   'meta-+': 'image-view:zoom-in'
   'meta-=': 'image-view:zoom-in'
   'meta--': 'image-view:zoom-out'
+  'meta-_': 'image-view:zoom-out'
   'meta-0': 'image-view:reset-zoom'


Update LineStore.cjsx

Update LineStore.cjsx

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/BethyDiakabananas/MBTA-Tweets-Site.git/'


Check the existence of socketPath.

Check the existence of socketPath.

See the comments for the reason.

--- src/atom-application.coffee
+++ src/atom-application.coffee
@@ -13,12 +13,22 @@
 module.exports =
 class AtomApplication
   @open: (options) ->
+    createAtomApplication = -> new AtomApplication(options)
+
+    # FIXME: Sometimes when socketPath doesn't exist, net.connect would strangely
+    # take a few seconds to trigger 'error' event, it could be a bug of node
+    # or atom-shell, before it's fixed we check the existence of socketPath to
+    # speedup startup.
+    if not fs.existsSync socketPath
+      createAtomApplication()
+      return
+
     client = net.connect {path: socketPath}, ->
       client.write JSON.stringify(options), ->
         client.end()
         app.terminate()

-    client.on 'error', -> new AtomApplication(options)
+    client.on 'error', createAtomApplication

   windows: null
   configWindow: null


Remove stray console.log

Remove stray console.log

--- src/command-registry.coffee
+++ src/command-registry.coffee
@@ -168,8 +168,6 @@

 class CommandListener
   constructor: (@selector, @callback) ->
-    console.log "calc specificity", @selector
-
     @specificity = (SpecificityCache[@selector] ?= specificity(@selector))
     @sequenceNumber = SequenceCount++


Allow CommandRegistry::rootNode to be assigned after construction

--- src/command-registry.coffee
+++ src/command-registry.coffee
@@ -9,6 +9,12 @@
   constructor: (@rootNode) ->
     @listenersByCommandName = {}

+  setRootNode: (rootNode) ->
+    throw new Error("Already assigned root node.") if @rootNode?
+    @rootNode = rootNode
+    for commandName of @listenersByCommandName
+      @rootNode?.addEventListener(commandName, @dispatchCommand, true)
+
   add: (selector, commandName, callback) ->
     if typeof commandName is 'object'
       commands = commandName
@@ -18,7 +24,7 @@
       return disposable

     unless @listenersByCommandName[commandName]?
-      @rootNode.addEventListener(commandName, @dispatchCommand, true)
+      @rootNode?.addEventListener(commandName, @dispatchCommand, true)
       @listenersByCommandName[commandName] = []

     listener = new CommandListener(selector, callback)


Not showing particles in IE.

Not showing particles in IE.

--- app/models/User.coffee
+++ app/models/User.coffee
@@ -124,6 +124,7 @@
     @gemPromptGroup

   getForeshadowsLevels: ->
+    return false if $.browser.msie
     return @foreshadowsLevels if @foreshadowsLevels?
     group = me.get('testGroupNumber') % 16
     @foreshadowsLevels = switch group


Update static/vendors/morrisjs/lib/morris.bar.coffee

Signed-off-by: Bernard Ojengwa <fccb4cc00c1ba7e51bf5c2b5f77130b9fe8d917e@gmail.com>

error: pathspec 'static/vendors/morrisjs/lib/morris.bar.coffee' did not match any file(s) known to git

--- static/vendors/morrisjs/lib/morris.bar.coffee
+++ static/vendors/morrisjs/lib/morris.bar.coffee
@@ -0,0 +1,208 @@
+class Morris.Bar extends Morris.Grid
+  constructor: (options) ->
+    return new Morris.Bar(options) unless (@ instanceof Morris.Bar)
+    super($.extend {}, options, parseTime: false)
+
+  init: ->
+    @cumulative = @options.stacked
+
+    if @options.hideHover isnt 'always'
+      @hover = new Morris.Hover(parent: @el)
+      @on('hovermove', @onHoverMove)
+      @on('hoverout', @onHoverOut)
+      @on('gridclick', @onGridClick)
+
+  # Default configuration
+  #
+  defaults:
+    barSizeRatio: 0.75
+    barGap: 3
+    barColors: [
+      '#0b62a4'
+      '#7a92a3'
+      '#4da74d'
+      '#afd8f8'
+      '#edc240'
+      '#cb4b4b'
+      '#9440ed'
+    ],
+    barOpacity: 1.0
+    barRadius: [0, 0, 0, 0]
+    xLabelMargin: 50
+
+  # Do any size-related calculations
+  #
+  # @private
+  calc: ->
+    @calcBars()
+    if @options.hideHover is false
+      @hover.update(@hoverContentForRow(@data.length - 1)...)
+
+  # calculate series data bars coordinates and sizes
+  #
+  # @private
+  calcBars: ->
+    for row, idx in @data
+      row._x = @left + @width * (idx + 0.5) / @data.length
+      row._y = for y in row.y
+        if y? then @transY(y) else null
+
+  # Draws the bar chart.
+  #
+  draw: ->
+    @drawXAxis() if @options.axes in [true, 'both', 'x']
+    @drawSeries()
+
+  # draw the x-axis labels
+  #
+  # @private
+  drawXAxis: ->
+    # draw x axis labels
+    ypos = @bottom + (@options.xAxisLabelTopPadding || @options.padding / 2)
+    prevLabelMargin = null
+    prevAngleMargin = null
+    for i in [0...@data.length]
+      row = @data[@data.length - 1 - i]
+      label = @drawXAxisLabel(row._x, ypos, row.label)
+      textBox = label.getBBox()
+      label.transform("r#{-@options.xLabelAngle}")
+      labelBox = label.getBBox()
+      label.transform("t0,#{labelBox.height / 2}...")
+      if @options.xLabelAngle != 0
+        offset = -0.5 * textBox.width *
+          Math.cos(@options.xLabelAngle * Math.PI / 180.0)
+        label.transform("t#{offset},0...")
+      # try to avoid overlaps
+      if (not prevLabelMargin? or
+          prevLabelMargin >= labelBox.x + labelBox.width or
+          prevAngleMargin? and prevAngleMargin >= labelBox.x) and
+         labelBox.x >= 0 and (labelBox.x + labelBox.width) < @el.width()
+        if @options.xLabelAngle != 0
+          margin = 1.25 * @options.gridTextSize /
+            Math.sin(@options.xLabelAngle * Math.PI / 180.0)
+          prevAngleMargin = labelBox.x - margin
+        prevLabelMargin = labelBox.x - @options.xLabelMargin
+      else
+        label.remove()
+
+  # draw the data series
+  #
+  # @private
+  drawSeries: ->
+    groupWidth = @width / @options.data.length
+    numBars = if @options.stacked then 1 else @options.ykeys.length
+    barWidth = (groupWidth * @options.barSizeRatio - @options.barGap * (numBars - 1)) / numBars
+    barWidth = Math.min(barWidth, @options.barSize) if @options.barSize
+    spaceLeft = groupWidth - barWidth * numBars - @options.barGap * (numBars - 1)
+    leftPadding = spaceLeft / 2
+    zeroPos = if @ymin <= 0 and @ymax >= 0 then @transY(0) else null
+    @bars = for row, idx in @data
+      lastTop = 0
+      for ypos, sidx in row._y
+        if ypos != null
+          if zeroPos
+            top = Math.min(ypos, zeroPos)
+            bottom = Math.max(ypos, zeroPos)
+          else
+            top = ypos
+            bottom = @bottom
+
+          left = @left + idx * groupWidth + leftPadding
+          left += sidx * (barWidth + @options.barGap) unless @options.stacked
+          size = bottom - top
+
+          if @options.verticalGridCondition and @options.verticalGridCondition(row.x)
+            @drawBar(@left + idx * groupWidth, @top, groupWidth, Math.abs(@top - @bottom), @options.verticalGridColor, @options.verticalGridOpacity, @options.barRadius)
+
+          top -= lastTop if @options.stacked
+          @drawBar(left, top, barWidth, size, @colorFor(row, sidx, 'bar'),
+              @options.barOpacity, @options.barRadius)
+
+          lastTop += size
+        else
+          null
+
+  # @private
+  #
+  # @param row  [Object] row data
+  # @param sidx [Number] series index
+  # @param type [String] "bar", "hover" or "label"
+  colorFor: (row, sidx, type) ->
+    if typeof @options.barColors is 'function'
+      r = { x: row.x, y: row.y[sidx], label: row.label }
+      s = { index: sidx, key: @options.ykeys[sidx], label: @options.labels[sidx] }
+      @options.barColors.call(@, r, s, type)
+    else
+      @options.barColors[sidx % @options.barColors.length]
+
+  # hit test - returns the index of the row at the given x-coordinate
+  #
+  hitTest: (x) ->
+    return null if @data.length == 0
+    x = Math.max(Math.min(x, @right), @left)
+    Math.min(@data.length - 1,
+      Math.floor((x - @left) / (@width / @data.length)))
+
+  # click on grid event handler
+  #
+  # @private
+  onGridClick: (x, y) =>
+    index = @hitTest(x)
+    @fire 'click', index, @data[index].src, x, y
+
+  # hover movement event handler
+  #
+  # @private
+  onHoverMove: (x, y) =>
+    index = @hitTest(x)
+    @hover.update(@hoverContentForRow(index)...)
+
+  # hover out event handler
+  #
+  # @private
+  onHoverOut: =>
+    if @options.hideHover isnt false
+      @hover.hide()
+
+  # hover content for a point
+  #
+  # @private
+  hoverContentForRow: (index) ->
+    row = @data[index]
+    content = "
#{row.label}
"
+    for y, j in row.y
+      content += """
+

+          #{@options.labels[j]}:
+          #{@yLabelFormat(y)}
+

+      """
+    if typeof @options.hoverCallback is 'function'
+      content = @options.hoverCallback(index, @options, content, row.src)
+    x = @left + (index + 0.5) * @width / @data.length
+    [content, x]
+
+  drawXAxisLabel: (xPos, yPos, text) ->
+    label = @raphael.text(xPos, yPos, text)
+      .attr('font-size', @options.gridTextSize)
+      .attr('font-family', @options.gridTextFamily)
+      .attr('font-weight', @options.gridTextWeight)
+      .attr('fill', @options.gridTextColor)
+
+  drawBar: (xPos, yPos, width, height, barColor, opacity, radiusArray) ->
+    maxRadius = Math.max(radiusArray...)
+    if maxRadius == 0 or maxRadius > height
+      path = @raphael.rect(xPos, yPos, width, height)
+    else
+      path = @raphael.path @roundedRect(xPos, yPos, width, height, radiusArray)
+    path
+      .attr('fill', barColor)
+      .attr('fill-opacity', opacity)
+      .attr('stroke', 'none')
+
+  roundedRect: (x, y, w, h, r = [0,0,0,0]) ->
+    [ "M", x, r[0] + y, "Q", x, y, x + r[0], y,
+      "L", x + w - r[1], y, "Q", x + w, y, x + w, y + r[1],
+      "L", x + w, y + h - r[2], "Q", x + w, y + h, x + w - r[2], y + h,
+      "L", x + r[3], y + h, "Q", x, y + h, x, y + h - r[3], "Z" ]
+


Support kadira:flow-router

Support kadira:flow-router

flow-router is now (> v2.0) served by kadira

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/dropfen/meteor-active-route.git/'


only call the most recently added keybinding

--- src/key-binder.coffee
+++ src/key-binder.coffee
@@ -56,7 +56,8 @@
     callbacks = @bindings[binding]
     return false if not callbacks

-    callback() for callback in callbacks
+    # Only use the most recently added binding
+    _.last(callbacks)()
     true

   @bindingParser: (binding) ->


[fix] [osu] Heh. Heheh. This didn't even work.


[add] [osu] Accidentally ommited a file D:


:lipstick:

:lipstick:

--- lib/load-paths-task.coffee
+++ lib/load-paths-task.coffee
@@ -18,7 +18,7 @@
     args = ['-l', rootPath]
     args.unshift("--addVCSIgnores") if config.get('nak.addVCSIgnores')
     args.unshift("-d", "#{ignoredNames.join(',')}") if ignoredNames.length > 0
-
+
     paths = []
     deferred = $.Deferred()
     exit = (code) =>
@@ -35,4 +35,3 @@

   abort: ->
     @aborted = true
-


Bug fixes

Bug fixes

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bubblegroup/bubblebot.git/'


Create buzzfeed.coffee

Create buzzfeed.coffee

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/RivalNick/Buzzfeed.git/'


Improved the events comment.

Improved the events comment.

--- src/dropzone.coffee
+++ src/dropzone.coffee
@@ -117,9 +117,12 @@

     ###
-    Those functions register themselves to the events on init.
-    You can overwrite them if you don't like the default behavior. If you just want to add an additional
-    event handler, register it on the dropzone object and don't overwrite those options.
+    Those functions register themselves to the events on init and handle all
+    the user interface specific stuff. Overwriting them won't break the upload
+    but can break the way it's displayed.
+    You can overwrite them if you don't like the default behavior. If you just
+    want to add an additional event handler, register it on the dropzone object
+    and don't overwrite those options.
     ###


More flexible previewTemplate (optional fields)

Let previewTemplate have zero or more
elements that represent data - filename, size, etc.
This will in effect make all fields optional.

--- src/dropzone.coffee
+++ src/dropzone.coffee
@@ -281,8 +281,8 @@
       file.previewTemplate = file.previewElement # Backwards compatibility

       @previewsContainer.appendChild file.previewElement
-      file.previewElement.querySelector("[data-dz-name]").textContent = file.name
-      file.previewElement.querySelector("[data-dz-size]").innerHTML = @filesize file.size
+      node.textContent = file.name for node in file.previewElement.querySelectorAll("[data-dz-name]")
+      node.innerHTML = @filesize file.size for node in file.previewElement.querySelectorAll("[data-dz-size]")

       if @options.addRemoveLinks
         file._removeLink = Dropzone.createElement """#{@options.dictRemoveFile}"""
@@ -311,16 +311,16 @@
     thumbnail: (file, dataUrl) ->
       file.previewElement.classList.remove "dz-file-preview"
       file.previewElement.classList.add "dz-image-preview"
-      thumbnailElement = file.previewElement.querySelector("[data-dz-thumbnail]")
-      thumbnailElement.alt = file.name
-      thumbnailElement.src = dataUrl
+      for thumbnailElement in file.previewElement.querySelectorAll("[data-dz-thumbnail]")
+        thumbnailElement.alt = file.name
+        thumbnailElement.src = dataUrl

     # Called whenever an error occurs
     # Receives `file` and `message`
     error: (file, message) ->
       file.previewElement.classList.add "dz-error"
-      file.previewElement.querySelector("[data-dz-errormessage]").textContent = message
+      node.textContent = message for node in file.previewElement.querySelectorAll("[data-dz-errormessage]")

     errormultiple: noop

@@ -337,7 +337,7 @@
     # Receives `file`, `progress` (percentage 0-100) and `bytesSent`.
     # To get the total number of bytes of the file, use `file.size`
     uploadprogress: (file, progress, bytesSent) ->
-      file.previewElement.querySelector("[data-dz-uploadprogress]").style.width = "#{progress}%"
+      node.style.width = "#{progress}%" for node in file.previewElement.querySelectorAll("[data-dz-uploadprogress]")

     # Called whenever the total upload progress gets updated.
     # Called with totalUploadProgress (0-100), totalBytes and totalBytesSent


Listen for ‘blur’ on mini editor of select list rather than ‘focusout’

The focusout handler on the mini editor’s hidden input wasn’t being
triggered, but we can listen for blur directly on the editor now that
the shadow DOM abstracts the focus.

--- src/select-list-view.coffee
+++ src/select-list-view.coffee
@@ -57,7 +57,7 @@
   initialize: ->
     @filterEditorView.getEditor().getBuffer().onDidChange =>
       @schedulePopulateList()
-    @filterEditorView.hiddenInput.on 'focusout', =>
+    @filterEditorView.on 'blur', =>
       @cancel() unless @cancelling

     # This prevents the focusout event from firing on the filter editor view


Coffee test

Coffee test

error: pathspec 'test.coffee' did not match any file(s) known to git

--- test.coffee
+++ test.coffee
@@ -0,0 +1,42 @@
+gtk = require './build/default/gtk'
+
+# Event loop
+main = ->
+  if not gtk.main()
+    setTimeout ->
+      main()
+    , 20
+
+window = new gtk.Window
+button = new gtk.Button
+dialog = new gtk.MessageDialog(
+  window
+  gtk.DIALOG_DESTROY_WITH_PARENT
+  gtk.MESSAGE_INFO
+  gtk.BUTTONS_YES_NO
+  'This is an alert!'
+)
+
+# Start the loop when we show the window.
+window.onShow = main
+window.setTitle     'Coffee + GTK'
+window.setResizable yes
+window.setOpacity   0.9
+window.setDefaultSize()
+window.onDestroy = ->
+  console.log window.getOpacity()
+  console.log window.getPosition()
+  console.log window.getSize()
+  console.log window.getResizable()
+  console.log window.getTitle()
+  console.log 'OMG. Everything dies.'
+
+button.setLabel 'Test Button.'
+button.onClick = ->
+  console.log 'Button was clicked'
+window.add button
+
+window.show()
+
+dialog.run()
+dialog.destroy()


[repl] nil out the js table

[repl] nil out the js table

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/demhydraz/cafe.git/'


opbeat?

opbeat?


add blog model test

add blog model test

error: pathspec 'test/blog.test.coffee' did not match any file(s) known to git

--- test/blog.test.coffee
+++ test/blog.test.coffee
@@ -0,0 +1,44 @@
+should = require 'should'
+mongoose = require 'mongoose'
+Entry = require('../app/models/blog').Entry
+utils = require '../app/controllers/utils'
+
+describe 'Blog', ->
+  before (done) ->
+    unless mongoose.connection.readyState
+      mongoose.connect 'mongodb://localhost/fluiddb_dev', null, ->
+        done()
+
+  after (done) ->
+    mongoose.disconnect done
+
+  beforeEach (done) ->
+    entry = new Entry
+      title: 'entry creation'
+      author: 'author'
+      id: utils.slugify('entry-creation')
+      body: 'This is a test post'
+      tags: [{name: 'tag1'}]
+      category: 'test'
+      comments: []
+      creationDate: (new Date()).getTime() - (10 * 24 * 60 * 60 * 1000)
+      updateDate: null
+      published: true
+
+    entry.save (error) ->
+      if error
+        console.log "error" + error.message
+      else
+        console.log "no error"
+      done()
+
+  it "find an entry by id", (next) ->
+    Entry.findOne
+      id: "entry-creation"
+    , (err, entry) ->
+      entry.title.should.be.eql "entry creation"
+      next()
+
+  afterEach (done) ->
+    Entry.remove {id: "entry-creation"}, ->
+      done()


属性行のメモ行においてKey-ValueのValue側にも色がついてしまう不具合を修正。

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/masaru-matsunami/language-sad.git/'


Add initial spec to very grammar parses

Add initial spec to very grammar parses

error: pathspec 'spec/grammar-spec.coffee' did not match any file(s) known to git

--- spec/grammar-spec.coffee
+++ spec/grammar-spec.coffee
@@ -0,0 +1,13 @@
+describe "perl grammar", ->
+  grammar = null
+
+  beforeEach ->
+    waitsForPromise ->
+      atom.packages.activatePackage("language-perl")
+
+    runs ->
+      grammar = atom.grammars.grammarForScopeName("source.perl")
+
+  it "parses the grammar", ->
+    expect(grammar).toBeDefined()
+    expect(grammar.scopeName).toBe "source.perl"


Enable cross origin

Enable cross origin

error: pathspec 'server/lib/_cors.coffee' did not match any file(s) known to git

--- server/lib/_cors.coffee
+++ server/lib/_cors.coffee
@@ -0,0 +1,3 @@
+WebApp.connectHandlers.use (req, res, next) ->
+	res.setHeader("Access-Control-Allow-Origin", "*")
+	return next()


fix typo

fix typo

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/supersonic.git/'


a tester for bzip2 support

a tester for bzip2 support

error: pathspec 'test/files/bzip2.iced' did not match any file(s) known to git


Closes #28

Closes #28

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/alpire/picoCTF-web.git/'


progress

progress

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/companytools/ember-cli-dunlop.git/'


fixed reference to async from future in client

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/leonidas/qa-dashboard.git/'


Fix issue of attempting to parse error body as JSON.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/philbooth/GitHubReminder.git/'


Minor fix in the kernel shutdown proc

Minor fix in the kernel shutdown proc

--- library/nucleus/kernel.coffee
+++ library/nucleus/kernel.coffee
@@ -97,7 +97,8 @@
         util.puts require("os").EOL
         logger.warn reason.toString().red
         try @router.shutdownRouter()
-        s.unregister() for s in @router.registry
+        registry = @router.registry or []
+        s.unregister() for s in registry
         try @server.close(); try @secure.close()
         shutdown = "Shutting the kernel instance down".red
         logger.warn shutdown; @emit "shutdown"


Draft implementation of the elemenent resolve

--- library/visualize/tree.coffee
+++ library/visualize/tree.coffee
@@ -102,6 +102,20 @@
         throw new Error invalid unless correct
         @$prefix = prefix.toString()

+    # Resolve the specific node by its tag. The method is recursive
+    # and will look under the entire tree of this element. If no node
+    # whose tag matches the supplied one can be found, the method
+    # should return either undefined or false value, but not a node.
+    resolve: (tag) ->
+        correct = _.isString tag
+        return this if @tag is tag
+        invalid "The supplied node is not string"
+        throw new Error invalid unless correct
+        for own node in (@children or [])
+            return node if node.tag is tag
+            element = node instanceof Element
+            return n if n = node.reslove tag
+
     # Remove the supplied node from array of children nodes of
     # this element. The node undergoes some substantial testing
     # before it will be removed. If the node does not exist in the


Add controversial initial implementation of SETLOCATION

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/fulcrumapp/fulcrum-expressions.git/'


Add copy to default task

Add copy to default task

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/frostney/shopkeeper.git/'


bug fix

bug fix


add support for index.js to require()

add support for index.js to require()

--- src/bootstrap.coffee
+++ src/bootstrap.coffee
@@ -4,6 +4,9 @@

 modules = {}
 paths = ['src', 'vendor']
+read = (path) ->
+  root = OSX.NSBundle.mainBundle.resourcePath
+  OSX.NSString.stringWithContentsOfFile "#{root}/#{path}"
 this.require = (file) ->
   # hack for stupid requirejs
   if file.indexOf('ace/requirejs/text!') > -1
@@ -15,9 +18,10 @@
   code = null
   paths.forEach (path) ->
     return code if code
-    root = OSX.NSBundle.mainBundle.resourcePath + "/#{path}"
-    fullpath = if text then "#{root}/#{file}" else "#{root}/#{file}.js"
-    code = OSX.NSString.stringWithContentsOfFile fullpath
+    if text
+      code = read "#{path}/#{file}"
+    else
+      code = read("#{path}/#{file}.js") or read("#{path}/#{file}/index.js")

   if text
     modules[file] = code.toString()


:memo: doc parameters in clipboard.coffee

--- src/clipboard.coffee
+++ src/clipboard.coffee
@@ -11,7 +11,7 @@

   # Creates an `md5` hash of some text.
   #
-  # * text: A {String} to hash.
+  # text - A {String} to hash.
   #
   # Returns a hashed {String}.
   md5: (text) ->
@@ -22,8 +22,8 @@
   # The metadata associated with the text is available by calling
   # {.readWithMetadata}.
   #
-  # * text: A {String} to store.
-  # * metadata: An {Object} of additional info to associate with the text.
+  # text - The {String} to store.
+  # metadata - The additional info to associate with the text.
   write: (text, metadata) ->
     @signatureForMetadata = @md5(text)
     @metadata = metadata
@@ -38,8 +38,9 @@
   # Public: Read the text from the clipboard and return both the text and the
   # associated metadata.
   #
-  # Returns an {Object} with a `text` key and a `metadata` key if it has
-  # associated metadata.
+  # Returns an {Object} with the following keys:
+  #   :text - The {String} clipboard text.
+  #   :metadata - The metadata stored by an earlier call to {.write}.
   readWithMetadata: ->
     text = @read()
     if @signatureForMetadata is @md5(text)


background.coffee: remove `api` from `GLOBAL`

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/rremizov/github-notifier.git/'


Add keychain file to keep the passwords private

error: pathspec 'app/keychain.coffee' did not match any file(s) known to git

--- app/keychain.coffee
+++ app/keychain.coffee
@@ -0,0 +1,9 @@
+# Put your passwords in here
+# So that you don't accidentally share them on git
+keys =
+  "username": "password"
+
+module.exports = (key) ->
+  if not keys.hasOwnProperty(key)
+    console.log "(KeyChain) key not found: #{key}"
+  keys[key]


Add missing weather file

Add missing weather file

error: pathspec 'shared/weather.coffee' did not match any file(s) known to git

--- shared/weather.coffee
+++ shared/weather.coffee
@@ -0,0 +1,8 @@
+self = (module?.exports || window)
+
+self.Weather =
+  SUN: 'Sun'
+  RAIN: 'Rain'
+  HAIL: 'Hail'
+  SAND: 'Sand'
+  NONE: 'None'


Add another test for moveItemToLeft

Add another test for moveItemToLeft

--- spec/pane-spec.coffee
+++ spec/pane-spec.coffee
@@ -151,16 +151,18 @@
       pane = new Pane(items: [new Item("A"), new Item("B"), new Item("C")])
       [item1, item2, item3] = pane.getItems()

+      pane.activateItemAtIndex(0)
       expect(pane.getActiveItem()).toBe item1
       pane.moveItemToLeft()
       expect(pane.getItems()).toEqual [item1, item2, item3]
-
       pane.moveItemToRight()
       expect(pane.getItems()).toEqual [item2, item1, item3]
-
+      pane.moveItemToLeft()
+      expect(pane.getItems()).toEqual [item1, item2, item3]
+      pane.activateItemAtIndex(2)
+      expect(pane.getActiveItem()).toBe item3
       pane.moveItemToRight()
-      pane.moveItemToRight()
-      expect(pane.getItems()).toEqual [item2, item3, item1]
+      expect(pane.getItems()).toEqual [item1, item2, item3]

   describe "::activateItemAtIndex(index)", ->
     it "activates the item at the given index", ->


:lipstick:

:lipstick:

--- src/app/editor.coffee
+++ src/app/editor.coffee
@@ -666,7 +666,7 @@
   logCursorScope: ->
     console.log @activeEditSession.getCursorScopes()

-    # Public: Emulates the "page down" key, where the last row of a buffer scrolls to become the first.
+  # Public: Emulates the "page down" key, where the last row of a buffer scrolls to become the first.
   pageDown: ->
     newScrollTop = @scrollTop() + @scrollView[0].clientHeight
     @activeEditSession.moveCursorDown(@getPageRows())


:fire: logs

:fire: logs

--- src/browser/atom-application.coffee
+++ src/browser/atom-application.coffee
@@ -133,25 +133,20 @@
     autoUpdater.setFeedUrl "https://atom.io/api/updates?version=#{@version}"

     autoUpdater.on 'checking-for-update', =>
-      console.log "-------checking for update"
       @applicationMenu.showInstallUpdateItem(false)
       @applicationMenu.showCheckForUpdateItem(false)

     autoUpdater.on 'update-not-available', =>
-      console.log "-------update-not-available"
       @applicationMenu.showInstallUpdateItem(false)
       @applicationMenu.showCheckForUpdateItem(true)

     autoUpdater.on 'update-downloaded', (event, releaseNotes, releaseName, releaseDate, releaseURL) =>
-      console.log "-------update-downloaded"
       atomWindow.sendCommand('window:update-available', releaseName) for atomWindow in @windows
       @applicationMenu.showInstallUpdateItem(true)
       @applicationMenu.showCheckForUpdateItem(false)
       @updateVersion = releaseName

     autoUpdater.on 'error', (event, message) =>
-      console.log "-------error"
-      console.log event, message
       @applicationMenu.showInstallUpdateItem(false)
       @applicationMenu.showCheckForUpdateItem(true)

@@ -160,7 +155,6 @@

   checkForUpdate: ->
     autoUpdater.once 'update-available', ->
-      console.log "-------update-available!"
       dialog.showMessageBox
         type: 'info'
         buttons: ['OK']


Add RelayState to the generation of login urls.

--- lib/saml2.coffee
+++ lib/saml2.coffee
@@ -290,13 +290,16 @@

     # -- Required
     # Returns a redirect URL, at which a user can login, and the ID of the request.
-    create_login_url: (identity_provider, assert_endpoint, cb) =>
+    create_login_url: (identity_provider, assert_endpoint, relay_state..., cb) =>
+      relay_state = relay_state[0]
+
       { id, xml } = create_authn_request @issuer, assert_endpoint, identity_provider.sso_login_url
       zlib.deflateRaw xml, (err, deflated) ->
         return cb err if err?
         uri = url.parse identity_provider.sso_login_url
         uri.query =
           SAMLRequest: deflated.toString 'base64'
+          RelayState: relay_state
         cb null, url.format(uri), id

     # Returns an object containing the parsed response.


Fix lint error.

Fix lint error.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/RobotSnacks/stout-server.git/'


Call HTTP handler with handler as "this" scope.


added data story

added data story

error: pathspec 'review_front/app/store.coffee' did not match any file(s) known to git

--- review_front/app/store.coffee
+++ review_front/app/store.coffee
@@ -0,0 +1,7 @@
+`import DS from 'ember-data'`
+
+Store = DS.Store.extend
+  adapter: DS.ActiveModelAdapter
+
+`export default Store`
+


Adding capybara capabilities.

Adding capybara capabilities.

error: pathspec 'scripts/shipitharder.coffee' did not match any file(s) known to git

--- scripts/shipitharder.coffee
+++ scripts/shipitharder.coffee
@@ -0,0 +1,131 @@
+# Description:
+#   More Effective Rodent Motivation
+#
+#   Set the environment variable HUBOT_SHIP_EXTRA_CAPYBARAS (to anything)
+#   for additional motivation
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   HUBOT_SHIP_EXTRA_CAPYBARAS
+#
+# Commands:
+#   ship it harder - Display a motivational capybara when a squirrel just wont do!
+#
+# Original Author:
+#   maddox (capybaras added by DaveOps83)
+
+capybaras = [
+"http://www.rainforest-alliance.org/sites/default/files/uploads/4/capybara-family_15762686447_f9f8a0684a_o.jpg",
+"http://www.zooborns.com/.a/6a010535647bf3970b01a3fd3d706c970b-800wi",
+"http://www.porfell.co.uk/assets/PICT0125.jpg",
+"http://www.rainforest-alliance.org/sites/default/files/styles/responsive_breakpoints_theme_rainforest_wide_1x/public/slideshow/header/capybara_0.jpg%253Fitok%253DG1uvWT23",
+"http://thumbs.media.smithsonianmag.com//filer/2e/73/2e738d22-a273-4a77-a76e-c5486b80c309/02_07_2014_capybara_monkey.jpg__800x600_q85_crop.jpg",
+"http://library.sandiegozoo.org/factsheets/capybara/images/capybara.jpg",
+"http://ak-hdl.buzzfed.com/static/enhanced/webdr05/2013/4/29/14/enhanced-buzz-5639-1367258753-0.jpg",
+"http://a-z-animals.com/media/animals/images/original/capybara3.jpg",
+"http://vignette4.wikia.nocookie.net/cookieclicker/images/2/24/Capybara-02.jpg/revision/latest%253Fcb%253D20130810045256",
+"http://a-z-animals.com/media/animals/images/original/capybara5.jpg",
+"https://upload.wikimedia.org/wikipedia/commons/7/70/Capybara_2.jpg",
+"http://www.zooborns.com/.a/6a010535647bf3970b015433fc97e2970c-500wi",
+"https://upload.wikimedia.org/wikipedia/commons/8/85/Capybara_portrait.jpg",
+"http://a.dilcdn.com/bl/wp-content/uploads/sites/8/2013/05/025-624x616.jpg",
+"http://www.dallasnews.com/incoming/20130712-garl001.jpg.ece/BINARY/w595x467/garl001.JPG",
+"http://www.stlzoo.org/files/8813/0798/4082/capybara02.jpg",
+"http://www.zooborns.com/.a/6a010535647bf3970b019b02308fe1970b-800wi",
+"http://animalfactguide.com/wp-content/uploads/2013/01/iStock_000001572797XSmall.jpg",
+"http://sauceio.com/wp-content/uploads/2013/12/capybaras.jpg",
+"http://i.imgur.com/PIbKpeE.jpg",
+"http://40.media.tumblr.com/f9c96eb10e9086bc26b3ec31cf6dc82a/tumblr_mx34xbtS9P1r38hk2o1_1280.jpg",
+"http://i.ytimg.com/vi/-lqhleCf8R0/maxresdefault.jpg",
+"http://api.ning.com/files/2r6NdP2wa8OTUiSd7GiXVIyYcSB3EPPcR5CA1OFCF1dYNwsJ1C9t70GiPI6UMgJSYC2swr7NEOLNSVpcHpnV-aCSThPQ3AAj/Capybarafamily.jpg%253Fwidth%253D720%2526height%253D480",
+"http://i.livescience.com/images/i/000/048/850/i02/capybara-02.jpg%253F1324347800",
+"http://38.media.tumblr.com/84ae77bbf9768f28b7e5494060702006/tumblr_inline_nagg7e01wf1rhuc3f.jpg",
+"https://upload.wikimedia.org/wikipedia/en/b/b4/Capybara_male.jpg",
+"https://capybaraworld.files.wordpress.com/2014/03/donguri-yawns-40-you-can-see-yasushi-behind-her-and-little-baby-io-in-the-background-40.jpg%253Fw%253D750%2526h%253D421",
+"http://jeffkreeftmeijer.com/images/capybaras.jpg",
+"http://www.dapcat.org/wp-content/uploads/2014/03/Capybara-And-Cat-Cat-Picture.jpg",
+"http://media.giphy.com/media/10FvIiZ8W67wNW/giphy.gif",
+"http://40.media.tumblr.com/b8516edadabe88195d7c971a3d6299b7/tumblr_n0q4ewMUyP1sutuwgo1_1280.jpg",
+"http://s3-static-ak.buzzfed.com/static/2014-01/campaign_images/webdr02/13/17/27-ways-the-capybara-is-the-life-of-the-party-1-3528-1389653760-35_big.jpg",
+"http://www.zooborns.com/.a/6a010535647bf3970b019b02308ed6970b-800wi",
+"http://cdn2.arkive.org/media/82/82134A02-1C65-4051-878E-6A3BE12C9067/Presentation.Large/Portrait-of-infant-capybara.jpg",
+"http://40.media.tumblr.com/a54de0a2c94b8703fdfa988bbe130eb8/tumblr_mxuowa3OzO1sutuwgo1_1280.jpg",
+"http://a.dilcdn.com/bl/wp-content/uploads/sites/8/2013/05/147.jpg",
+"http://gianthamster.com/wp-content/uploads/2011/11/2009_04_18_02_CaplinPool_cropped.jpg",
+"http://gianthamster.com/wp-content/uploads/2013/07/2010_03_01_06_sCaplinMelanie.jpg",
+"http://media.mnn.com/assets/images/2015/04/pet-capybara.jpg",
+"https://capybaraworld.files.wordpress.com/2014/03/wn-scent-marking-capybara-straddling-plant-for-a-blog.jpg%253Fw%253D750%2526h%253D757",
+"http://i.dailymail.co.uk/i/pix/2014/02/03/article-2551095-1B2C322900000578-479_634x448.jpg",
+"http://40.media.tumblr.com/tumblr_m22m5htGGG1rtoixio1_500.jpg",
+"http://ngm.nationalgeographic.com/u/TvyamNb-BivtNwcoxtkc5xGBuGkIMh_nj4UJHQKuor8ESQ8FbgLInpSev4L5ezzHLXWAqUhznzvyNA/",
+"https://capybaraworld.files.wordpress.com/2014/04/20-of-romeo-one-of-the-worlds-great-leaders-april-4-2014-014.jpg%253Fw%253D750",
+"http://ak-hdl.buzzfed.com/static/2014-01/enhanced/webdr02/13/12/enhanced-buzz-19448-1389632861-30.jpg",
+"http://cdn0.lostateminor.com/wp-content/uploads/2015/02/Capybaras2.jpg",
+"http://i.dailymail.co.uk/i/pix/2013/06/21/article-2345934-1A6F477E000005DC-563_634x476.jpg",
+"https://media1.giphy.com/media/FvYUkjxRe2U0M/200_s.gif",
+"https://s-media-cache-ak0.pinimg.com/originals/d4/fa/e7/d4fae720ba3c18eff30a8acfc4ac0665.jpg",
+"http://40.media.tumblr.com/0dd167c95dc41206806d9b351c24974c/tumblr_mvqnfd21oc1sutuwgo1_1280.jpg",
+"http://gianthamster.com/wp-content/uploads/2009/05/caplin_profile_pool.jpg",
+"http://ichef-1.bbci.co.uk/news/304/media/images/72748000/jpg/_72748973_capybara-6.jpg",
+"http://thescoopblog.dallasnewsblogs.com/files/2013/07/tumblr_mpe4io1Duy1r03kk7o1_500.jpg",
+"http://41.media.tumblr.com/0d6ca07e0c4d2520ca8822183fd5f3c4/tumblr_my6ghpdKje1sutuwgo1_1280.jpg",
+"http://i.huffpost.com/gen/1241701/thumbs/o-CHEESECAKE-CAPYBARA-PUPPIES-570.jpg%253F16",
+"http://media.mnn.com/assets/images/2015/04/big-capybara.jpg",
+"http://36.media.tumblr.com/0adcb1bb7f9d7ccdbdb2449a3106f047/tumblr_npmr9gPv7G1u6hbi4o1_1280.jpg",
+"https://capybaraworld.files.wordpress.com/2014/04/45-faq-io-5-months-old-male-eating-his-cecotropes-mother-donguri-is-always-near-him-keeping-an-eye-on-him-and-making-sure-he-does-not-get-into-trouble.jpg",
+"http://i.huffpost.com/gen/1241696/thumbs/o-CHEESECAKE-CAPYBARA-PUPPIES-570.jpg%253F16",
+"http://www.zooborns.com/.a/6a010535647bf3970b011570362ae4970b-pi",
+"http://i.dailymail.co.uk/i/pix/2013/06/21/article-2345934-1A6F45DC000005DC-1000_634x476.jpg",
+"https://pbs.twimg.com/media/B9_X-jQIIAEhpcR.jpg",
+"http://s3.amazonaws.com/appendixjournal-images/images/attachments/000/000/189/large/l-Capybara-with-tiny-monkeys-riding-on-its-back.jpg%253F1358735010",
+"http://animal-backgrounds.com/download/2171/640x960/crop/capybara-animal-wallpaper-640x960.jpg",
+"http://cdn2.arkive.org/media/EB/EB0B5A72-3E4F-4717-96D5-1FADB30732F2/Presentation.Large/Female-capybara-suckling-two-infants.jpg",
+"https://capybaraworld.files.wordpress.com/2014/03/yasushi-loves-to-be-petted-august-2012.jpg",
+"http://i.dailymail.co.uk/i/pix/2013/06/21/article-2345934-1A6F4453000005DC-902_634x448.jpg",
+"http://i.dailymail.co.uk/i/pix/2013/06/21/article-2345934-1A6F4666000005DC-175_634x424.jpg",
+"http://i.livescience.com/images/i/000/043/573/i02/CapybaraBaby_Web_11.29.11.jpg%253F1322695173",
+"http://i2.wp.com/www.kittyarmy.com/wp-content/uploads/2013/06/o-CAPYBARA-HUGS-CAT-570.jpg",
+"http://www.newquayzoo.org.uk/userfiles/animals/images/2007_04_ray_wiltshire_4.jpg%253Fw%253D900%2526h%253D500",
+"http://gianthamster.com/wp-content/uploads/2013/09/2013_09_25_11_sGariPool.jpg",
+"http://gianthamster.com/wp-content/uploads/2010/12/V188_sCapybara.jpg",
+"http://lovemeow.com/wp-content/uploads/2015/01/1476035_758673774204483_6795465395002341575_n.jpg",
+"http://ichef.bbci.co.uk/naturelibrary/images/ic/credit/640x395/c/ca/capybara/capybara_1.jpg",
+"http://a-z-animals.com/media/animals/images/original/capybara7.jpg",
+"https://capybaraworld.files.wordpress.com/2014/04/40-uploaded-blog-faqs-snapshot0-romeo-and-tuffn-play-fighting-february-2014-jpeg.jpg%253Fw%253D750",
+"https://capybaraworld.files.wordpress.com/2014/03/snapshot16-toku-mating-momiji-jpeg-40-september-1-2013.jpg%253Fw%253D750%2526h%253D421",
+"https://capybaraworld.files.wordpress.com/2012/09/046.jpg",
+"https://s-media-cache-ak0.pinimg.com/736x/c3/d7/c8/c3d7c84dcf02b06f4fd58d21d0385944.jpg",
+"http://therevscience.com/wp-content/uploads/2013/05/169158_10100718789077725_301237654_o.jpg",
+"https://s-media-cache-ak0.pinimg.com/236x/64/46/ac/6446acbfdef68815b8bb161b16e8fad3.jpg",
+"http://19mvmv3yn2qc2bdb912o1t2n.wpengine.netdna-cdn.com/science/files/2014/01/capybara-bird.jpg",
+"http://r.ddmcdn.com/s_f/o_1/APL/uploads/2015/02/Preposterous-Pets-Season-1-Lifts-Gary-the-Capybara-Put-the-Cute-In-Rodent-1423969398.jpg",
+"http://31.media.tumblr.com/0cb4ac7d09a4f71b38c068206965dd92/tumblr_inline_nkyk5gCgT61s6kzh8.jpg",
+"https://s-media-cache-ak0.pinimg.com/236x/0c/66/dd/0c66ddc6a19d251eb5886097b65bfd96.jpg",
+"http://3.bp.blogspot.com/-Lah2ype_5f8/UuLavIR0D3I/AAAAAAAAAQE/wjQXQjqeAZY/s1600/Capybara%252Bpet.jpg",
+"http://41.media.tumblr.com/929c4e6e7223de7da46bef10ff18824a/tumblr_mt1gf4wjWD1sutuwgo1_1280.jpg",
+"https://s-media-cache-ak0.pinimg.com/736x/92/2d/6d/922d6dd9dc12f8313effe73ab9037623.jpg",
+"http://gianthamster.com/wp-content/uploads/2012/12/2010_05_23_01_sCaplinSnarling.jpg",
+"http://www.godvine.com/pics/capybara/capybara4.jpg",
+"https://capybaraworld.files.wordpress.com/2013/10/061.jpg",
+"http://vignette2.wikia.nocookie.net/wierdnwildcreatures/images/0/04/Capybara_front.jpg/revision/latest%253Fcb%253D20131004015805",
+"http://osdoc.cogsci.nl/2.9/tutorials/img/capybara/meowing-capybara.png",
+"https://s-media-cache-ak0.pinimg.com/236x/d3/6f/63/d36f63315896c2f6a746e223324f3239.jpg",
+"http://www.zooborns.com/.a/6a010535647bf3970b019b02301b9a970c-800wi",
+"http://big.assets.huffingtonpost.com/joecap1.gif",
+"http://assets.nydailynews.com/polopoly_fs/1.1960909!/img/httpImage/image.jpg_gen/derivatives/gallery_1200/joejoe-capybara.jpg",
+"https://upload.wikimedia.org/wikipedia/commons/2/2c/Hydrochoeris_hydrochaeris_Zoo_Praha_2011-3.jpg",
+"http://gianthamster.com/wp-content/uploads/2010/02/2009_09_01_sCaplinPool.jpg"
+]
+
+module.exports = (robot) ->
+
+  # Enable a looser regex if environment variable is set
+  if process.env.HUBOT_SHIP_EXTRA_CAPYBARAS
+    regex = /ship(ping|z|s|ped)?\s*it\s*harder/i
+  else
+    regex = /ship\s*it\s*harder/i
+
+  robot.hear regex, (msg) ->
+    msg.send msg.random capybaras


Deleting test temp folder before each run

error: pathspec 'test/prepare_test.coffee' did not match any file(s) known to git

--- test/prepare_test.coffee
+++ test/prepare_test.coffee
@@ -0,0 +1,12 @@
+# Since this 'before' block isn't contained inside a describe block, it runs
+# before all tests
+path = require 'path'
+fs = require 'fs'
+wrench = require 'wrench'
+cleanDir = path.resolve __dirname, './fixtures/delete_me'
+
+before ->
+  console.log "Prepare for integration tests"
+  console.log "Deleting '%s'", cleanDir
+  wrench.rmdirSyncRecursive cleanDir, true
+  wrench.mkdirSyncRecursive cleanDir


registry get: test

registry get: test

error: pathspec 'test/registry/get.coffee' did not match any file(s) known to git

--- test/registry/get.coffee
+++ test/registry/get.coffee
@@ -0,0 +1,21 @@
+
+mecano = require '../../src'
+test = require '../test'
+
+describe 'api register', ->
+
+  scratch = test.scratch @
+
+  describe 'global', ->
+
+    it 'get module', ->
+      module = mecano.get ['file', 'properties']
+      module.handler.should.be.type 'function'
+
+    it 'get unregistered module', ->
+      module = mecano.get ['does', 'not', 'exists']
+      console.log 'todo regsitry.get', module
+
+    it 'get all modules', ->
+      modules = mecano.get()
+      modules.file.properties[''].handler.should.be.type 'function'


email contestants who still have not deployed

error: pathspec 'scripts/contestants-without-deploys.coffee' did not match any file(s) known to git

--- scripts/contestants-without-deploys.coffee
+++ scripts/contestants-without-deploys.coffee
@@ -0,0 +1,16 @@
+require 'colors'
+env = require '../config/env'
+mongoose = require('../models')(env.mongo_url)
+
+Person = mongoose.model 'Person'
+
+console.log "name\temail\tteam_id"
+Person.find { role: 'contestant', email: /@/, }, (err, people) ->
+  throw err if err
+  i = people.length
+  people.forEach (person) ->
+    person.team (err, team) ->
+      throw err if err
+      if team?.stats?.pushes and not team?.stats?.deploys
+        console.log "#{person.name ? ""}\t#{person.email.replace(/\.nodeknockout\.com$/, '')}\t#{team}"
+      mongoose.connection.close() if --i is 0