added pinkman script

added pinkman script

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

--- src/scripts/pinkman.coffee
+++ src/scripts/pinkman.coffee
@@ -0,0 +1,41 @@
+# Description:
+#   Random quote from Jesse Pinkman of Breaking Bad
+#
+# Commands:
+#   hubot pinkman me bitch - Show status of currently running builds
+#
+# Author:
+#   Micah Martin
+
+module.exports = (robot) ->
+
+	quotes = [
+		"Yo!",
+		"Bitch!"
+		"Yo...Bitch!",
+		"Gatorade me bitch!",
+		"Look, I like making cherry product, but let's keep it real, alright? We make poison for people who don't care. We probably have the most unpicky customers in the world.",
+		"Possum. Big, freaky, lookin' bitch. Since when did they change it to opossum? When I was comin' up it was just possum. Opossum makes it sound like he's irish or something. Why do they gotta go changing everything?",
+		"Dude, you scared the shit out of me. When you say it's contamination. I mean, I'm thinking like... an ebola leak or something. Yeah, it's a disease on the Discovery Channel where all your intestines sort of just slip right out of your butt.",
+		"Yo, I get I shouldn't call, but I'm in a situation over here, and I need my money. Yeah, and thanks, Daddy Warbucks, but that was before my housing situation went completely testicular on me, okay?",
+		"Spooge? Not Mad Dog? Not Diesel? So lemme get this straight, you got jacked by a man named Spooge?",
+		"No, no, chili P is my signature!",
+		"For what it's worth, getting the shit kicked out of you? Not to say you get used to it, but you do kinda get used to it.",
+		"I got two dudes that turned into raspberry slushie and flushed down my toilet.",
+		"Oh well, heil Hitler, bitch!",
+		"Yo yo yo, 1 4 8, 3 to the 3, to the 6, to the 9, representin' the ABQ. What up, biatch? Leaveth tone.",
+		"This is my own private domicile and I will not be harassed... bitch!",
+		"You're my free pass... bitch",
+		"You can't order shit, Adolf.",
+		"Yeah Bitch! Magnets!",
+		"Yeah Mr. White. YEAH SCIENCE!",
+		"What's the point of being an outlaw if I gotta have responsibilities?",
+		"You either run from things or you face them, Mr. White. I learned it in rehab. It's all about accepting who you really are. I accept who I am. I'm the bad guy.",
+		"Got some big cow house way out that way, like two miles, but I don't see nobody. Yeah, where they live... the cows!"
+	]
+
+	robot.respond /pinkman me bitch/i, (msg) ->
+		randIndex = Math.floor((Math.random()*quotes.length)+1)
+		msg.send quotes[randIndex - 1]
+
+


update to new fission

update to new fission

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/slacy.me.git/'


supporters now have separate chat connections

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/'


Remove obsolete file

Remove obsolete file

--- h2o-web/src/main/steam/util/node-h2o/h2o.coffee
+++ h2o-web/src/main/steam/util/node-h2o/h2o.coffee
@@ -1,3 +0,0 @@
-exec = (require 'child_process').exec
-
-


Workspace: PanelClass is optional now.

Workspace: PanelClass is optional now.

--- client/landing/app/CommonViews/workspace/collaborativeworkspace.coffee
+++ client/landing/app/CommonViews/workspace/collaborativeworkspace.coffee
@@ -92,7 +92,8 @@
     panelOptions             = @getOptions().panels[@lastCreatedPanelIndex]
     panelOptions.delegate    = @
     panelOptions.sessionKeys = @sessionData[@lastCreatedPanelIndex]  if @sessionData
-    newPanel                 = new CollaborativePanel panelOptions
+    PanelClass               = @getOptions().PanelClass or CollaborativePanel
+    newPanel                 = new PanelClass panelOptions

     @container.addSubView newPanel
     @panels.push newPanel


Remove project from subject

Remove project from subject

--- plugins/uservoice/index.coffee
+++ plugins/uservoice/index.coffee
@@ -3,14 +3,14 @@
 class UserVoice extends NotificationPlugin
   @receiveEvent: (config, event, callback) ->
     return if event?.trigger?.type == "reopened"
-
+
     # Build the payload
     payload =
       name: "Bugsnag"
       client: config.apiKey
       email: "bugsnag@bugsnag.com"
       ticket:
-        subject: "[#{event.project.name}] #{event.error.exceptionClass} in #{event.error.context}"
+        subject: "#{event.error.exceptionClass} in #{event.error.context}"
         message:
           """
           #{event.error.exceptionClass} in #{event.error.context} for project #{event.project.name}


First unit test

First unit test

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

--- test/spec/simple.coffee
+++ test/spec/simple.coffee
@@ -0,0 +1,13 @@
+describe 'amara', ->
+
+  it 'Mixed dependencies', (done) ->
+    define 'a', -> 1
+    define 'b', -> 2
+    define 'c', ['a', 'b'], (a, b) -> a + b
+    define 'd', ['c', 'b', 'a'], (c, b, a) -> c * (b + a)
+    define 'e', ['d'], (d) -> d * 3
+
+    require ['e'], (e) ->
+      expect(e).to.be.a 'number'
+      expect(e).to.equal 27
+      done()


initialize selectizes and sliders on nested field insertion, like we've done with redactor fields before

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/pisaq/para.git/'


Add tests for Listener

Add tests for Listener

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/sharabash/hubot.git/'


H1 coffee

H1 coffee

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

--- public/js/interactive_lessons/hoofdstuk1.coffee
+++ public/js/interactive_lessons/hoofdstuk1.coffee
@@ -0,0 +1,26 @@
+this.lesson = new Lesson([
+  new Question(
+    {
+      description: "Laten we bij het begin beginnen! In Ruby kun je makkelijk variabelen gebruiken om iets in op te slaan. Begin eens met x = 1",
+      answer: /x\s*=\s*1/,
+      possible_errors: {
+          wrong_value: /x\s*=\s*\d/
+      },
+      error_messages: {
+          wrong_value: "Je hebt de verkeerde waarde toegewezen.",
+          default: "Dat is niet goed. Typte je x = 1?"
+      }
+  }),
+  new Question(
+    {
+      description: "Oké, dat viel mee. Een andere soort variabele is een 'string'. Gebruik hiervoor aanhalingstekens. Typ eens naam = \"jouw naam\"",
+      answer: /naam\s*=\s*\"[\w\s]*\"/,
+      possible_errors: {
+          quotes_vergeten: /naam\s*=\s*[\w\s]*|naam\s*=\s*\"[\w\s]*|naam\s*=\s*[\w\s]*\"/
+      },
+      error_messages: {
+          quotes_vergeten: "Let op de aanhalingstekens.",
+          default: "Dat is niet goed. Typte je x = 1?"
+      }
+  })
+])


Fixed winston require in EarnedAchievement handler.

--- server/achievements/EarnedAchievement.coffee
+++ server/achievements/EarnedAchievement.coffee
@@ -1,6 +1,7 @@
 mongoose = require 'mongoose'
 jsonschema = require '../../app/schemas/models/earned_achievement'
 util = require '../../app/lib/utils'
+log = require 'winston'

 EarnedAchievementSchema = new mongoose.Schema({
   notified:
@@ -68,6 +69,6 @@
     (new EarnedAchievement(earned)).save (err, doc) ->
       return log.error err if err?
       earnedPoints = worth
-      wrapUp(doc)
+      wrapUp(doc)

 module.exports = EarnedAchievement = mongoose.model('EarnedAchievement', EarnedAchievementSchema)


don't double respond to DMs with slash commands in them

--- index.coffee
+++ index.coffee
@@ -103,7 +103,8 @@
   processCommand(bot, message)

 controller.on "direct_message", (bot, message) ->
-  processCommand(bot, message)
+  if message.text.indexOf("/looker") != 0
+    processCommand(bot, message)

 processCommand = (bot, message) ->


fixes previous commit about transitionend event of activitylistitems

--- client/app/Applications/Activity.kdapplication/ListItems/ActivityListItem.coffee
+++ client/app/Applications/Activity.kdapplication/ListItems/ActivityListItem.coffee
@@ -72,9 +72,9 @@
       @addChildView teaser, => @slideIn()

   slideIn:(callback=noop)->
-    @once 'transition', callback.bind @
+    @once 'transitionend', callback.bind @
     @unsetClass 'hidden-item'

   slideOut:(callback=noop)->
-    @once 'transition', callback.bind @
+    @once 'transitionend', callback.bind @
     @setClass 'hidden-item'


that was bugging me

that was bugging me

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/phillips1012/pasteHTML.git/'


Change the call method of shell

Change the call method of shell

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/Hiroto-K/MP3-Downloader.git/'


Update Brush specs

Update Brush specs

--- spec/javascripts/player/brush_spec.js.coffee
+++ spec/javascripts/player/brush_spec.js.coffee
@@ -18,9 +18,10 @@
         bright   : true
         italic   : false
         underline: true
+        reverse  : true

       hash = AsciiIo.Brush.hash attrs
-      expect(hash).toEqual '1_2_false_true_false_true'
+      expect(hash).toEqual '1_2_false_true_false_true_true'

   describe '.create', ->

@@ -77,10 +78,11 @@

   describe '#attributes', ->

-    it 'includes fg, bg, blink, bright, italic, underline', ->
+    it 'includes fg, bg, blink, bright, italic, underline, reverse', ->
       brush = new AsciiIo.Brush
       attrs = brush.attributes()
-      expectedAttrs = ['fg', 'bg', 'blink', 'bright', 'italic', 'underline']
+      expectedAttrs =
+        ['fg', 'bg', 'blink', 'bright', 'italic', 'underline', 'reverse']

       expect(_(attrs).keys().length).toEqual _(expectedAttrs).keys().length


インデント間違ってるのはｱｶﾝ

インデント間違ってるのはｱｶﾝ

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/april418/riot-table.git/'


Test directive: display properly & basic behavior & communicate with controller

error: pathspec 'coffee_test/spec/directives/supermanDirective.coffee' did not match any file(s) known to git

--- coffee_test/spec/directives/supermanDirective.coffee
+++ coffee_test/spec/directives/supermanDirective.coffee
@@ -0,0 +1,32 @@
+describe 'Unit test: superman directive', ->
+  beforeEach ->
+    module 'angularjsGettingStartedApp'
+  $rootScope = $compile = $httpBackend = {}
+  beforeEach ->
+    inject ['$compile','$rootScope', ($c,$r) ->
+      $rootScope = $r
+      $compile = $c
+    ]
+  it 'should display right', ->
+    elem = $compile('<superman></superman>')($rootScope)
+    expect(elem.html()).toMatch /day/i
+
+  it 'should have class `enter` when mouse enter', ->
+    elem = $compile('<superman enter="sky"></superman>')($rootScope)
+    elem.triggerHandler("mouseenter")
+    expect(elem.hasClass('sky')).toEqual true
+    elem.triggerHandler("mouseleave")
+    expect(elem.hasClass('sky')).not.toEqual true
+
+  it 'should call fly function when click', ->
+    scope = undefined
+    # inject ($controller,$rootScope) ->
+    #   scope = $rootScope.$new()
+    #   $controller 'FirstCtrl',
+    #     $scope: scope
+    scope = $rootScope.$new()
+    scope.fly = jasmine.createSpy('fly')
+    elem = $compile('<superman enter="sky" transport="fly()"></superman>')(scope)
+    supermanCtrl = elem.controller('superman')
+    elem.triggerHandler('click')
+    expect(scope.fly).toHaveBeenCalled()


add info to confirm message

add info to confirm message

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/UM-USElab/gradecraft-development.git/'


test/virtualmachines: build stack to prepare environment

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/'


Small improvements

Small improvements

--- views/single-tabarea.cjsx
+++ views/single-tabarea.cjsx
@@ -64,11 +64,11 @@
   handleMiniShipChange: (e) ->
     e.preventDefault()
     if e.detail.state
-      @setState {key: -2} if @state.key isnt -2
+      @handleSelect 1
     else
-      @setState {key: 0} if @state.key isnt 0
+      @handleSelect 0
   handleCtrlOrCmdTabKeyDown: ->
-    @handleSelect 0
+    @handleSelectMainView()
   handleCtrlOrCmdNumberKeyDown: (num) ->
     if num == 1
       @handleSelectMainView()
@@ -77,11 +77,25 @@
         @handleSelectShipView()
       else
         if num <= 2 + tabbedPlugins.length
-          @handleSelect num - 2
+          @handleSelect num - 1
   handleShiftTabKeyDown: ->
-    @handleSelect if @state.key? then (@state.key + tabbedPlugins.length) % (1 + tabbedPlugins.length) else tabbedPlugins.length
+    next = if @state.key? then (@state.key + tabbedPlugins.length) % (1 + tabbedPlugins.length) else tabbedPlugins.length
+    if next == 0
+      @handleSelectMainView()
+    else
+      if next == 1
+        @handleSelectShipView()
+      else
+        @handleSelect next
   handleTabKeyDown: ->
-    @handleSelect if @state.key? then (@state.key + 1) % (1 + tabbedPlugins.length) else 1
+    next = if @state.key? then (@state.key + 1) % (1 + tabbedPlugins.length) else 1
+    if next == 0
+      @handleSelectMainView()
+    else
+      if next == 1
+        @handleSelectShipView()
+      else
+        @handleSelect next
   handleKeyDown: ->
     return if @listener?
     @listener = true
@@ -116,19 +130,19 @@
         <NavItem key={0} eventKey={0} onSelect={@handleSelectMainView}>
           {mainview.displayName}
         </NavItem>
-        <NavItem key={-2} eventKey={-2} onSelect={@handleSelectShipView}>
+        <NavItem key={1} eventKey={1} onSelect={@handleSelectShipView}>
           <FontAwesome key={0} name='server' />{__ ' Fleet'}
         </NavItem>
         <NavDropdown id='plugin-dropdown' key={-1} eventKey={-1}
                      title=
                      {
-                       if @state.key >= 1 and @state.key < 1000
-                         {plugins[@state.key - 1].displayName}
+                       if @state.key >= 2 and @state.key < 1000
+                         {plugins[@state.key - 2].displayName}
                        else
                          <FontAwesome name='sitemap' />{__ ' Plugins'}
                      }>
         {
-          counter = 0
+          counter = 1
           plugins.map (plugin, index) =>
             if plugin.handleClick
               <MenuItem key={2 + index} eventKey={0} onSelect={plugin.handleClick}>
@@ -146,7 +160,7 @@
         </NavItem>

-

+

           {
             React.createElement mainview.reactClass,
               selectedKey: @state.key
@@ -154,7 +168,7 @@
           }

         {
-          counter = 0
+          counter = 1
           plugins.map (plugin, index) =>
             if !plugin.handleClick
               key = (counter += 1)


Repository now does notification on Not Authorized & Not Authenticated

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/MicrosmartSA/ubiquity-ui.git/'


Updated current values of normative data

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/'


Ensure log in

Ensure log in

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/TFarla/trello-clone.git/'


add email

add email

error: pathspec 'scripts/emails/contestant-services-email.coffee' did not match any file(s) known to git

--- scripts/emails/contestant-services-email.coffee
+++ scripts/emails/contestant-services-email.coffee
@@ -0,0 +1,53 @@
+require 'colors'
+env = require '../config/env'
+mongoose = require('../models')(env.mongo_url)
+util = require 'util'
+postageapp = require('postageapp')(env.secrets.postageapp)
+_ = require('underscore')
+async = require('async')
+
+template_name = "contestant_pre_2days"
+
+Team = mongoose.model 'Team'
+Person = mongoose.model 'Person'
+
+currentTeam = null
+
+msgTeam = (team, callback) ->
+  currentTeam = team
+  currentTeam.people (err, people) ->
+    return callback(err) if err
+    emailable = (person for person in people when /@/.test(person.email))
+    util.log "Sending '#{template_name}' to '#{team.name}'".yellow
+    async.forEach emailable, msgPerson, callback
+
+msgPerson = (person, callback) ->
+  email = person.email
+  name = person.name or person.slug
+  firstName = name?.split(/\s+/)[0] ? ''
+
+  address = if name
+      "\"#{name}\" <#{email}>"
+    else
+      email
+  util.log "\t -> #{address} (#{firstName})".yellow
+
+  postageapp.sendMessage
+    recipients: address
+    template: template_name
+    variables:
+      team: "#{currentTeam.name}"
+      team_id: "#{currentTeam.id}"
+      slug: "#{currentTeam.slug}"
+    , (args...) ->
+      # console.log "completed sending"
+      # console.log args
+      # callback(args...)
+      callback()
+
+Team.find {}, (err, teams) ->
+  throw err if err
+
+  async.forEachSeries teams, msgTeam, (err) ->
+    util.error(err) if err
+    mongoose.connection.close()


debug

debug

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/pervino/solidus_designs.git/'


concat all view in view.coffee

concat all view in view.coffee

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

--- scripts/coffee/view.coffee
+++ scripts/coffee/view.coffee
@@ -0,0 +1,43 @@
+# Class for DOM manipulations
+class ViewField
+	constructor: (@size) ->
+		do @_initCells
+
+	_initCells: ->
+		#generate cells
+		@cells = []
+		for y in [0...@size.y]
+			for x in [0...@size.x]
+				loopCell = new ViewCell({y: y, x: x})
+				do loopCell.deactivate
+				@cells.push loopCell
+
+	_getCell: ->
+		#work with one or two arguments
+		return if arguments.length > 2 || arguments.length == 0
+		position = switch arguments.length
+			when 1 then arguments[0]
+			when 2 then { x: arguments[0], y: arguments[1] }
+
+		return if position.x > @size.x || position.y > @size.y
+		@cells[(position.y * @size.x) + position.x]
+
+	setCellStatus: (cell, status) ->
+		cell = @_getCell(cell)
+		if status
+			do cell.activate
+		else
+			do cell.deactivate
+
+	clear: ->
+		do cell.deactivate for cell in @cells
+
+# Class for cell DOM
+class ViewCell
+	constructor: (position)->
+		@DOMcell = document.querySelectorAll('.game-field tr')[position.y].children[position.x]
+
+	activate: ->
+		@DOMcell.className = 'active'
+	deactivate: ->
+		@DOMcell.className = ''


Admin: Stacks: Refactor config data in server configuration.


add env to config

add env to 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.git/'


Fix empty single-line empty doc comment (no longer matches the whole next line)

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/pyfisch/atom-language-rust.git/'


added commas to options

added commas to options

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/noprob.git/'


added an example

added an example

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

--- examples/demo.coffee
+++ examples/demo.coffee
@@ -0,0 +1,17 @@
+#!/usr/bin/env coffee
+(require 'cmdr')
+  help:
+    pi: -> console.log "very important for a restaurant"
+
+  order: (meal="") ->
+    if meal.length is 0
+      console.error "you need to order something"
+      process.exit 1
+    else
+      console.log "delivering #{meal}"
+      process.exit 0
+
+  list:
+    meals: -> console.log "- chicken\n- cheese\n- potatoes"
+
+  pi: -> console.log 3.1415


Modified in browser at pixie.strd6.com

Modified in browser at pixie.strd6.com

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

--- src/color2.coffee
+++ src/color2.coffee
@@ -0,0 +1,10 @@
+( ->
+  Color2 = (args...) ->
+    __proto__: Color::
+
+  Color:: =
+    aMethod: ->
+      true
+
+  (exports ? this)["Color2"] = Color2
+)()


Keep around atom.config.unobserve no-op

Keep around atom.config.unobserve no-op

--- src/config.coffee
+++ src/config.coffee
@@ -1158,6 +1158,9 @@
     resultObject = object
   resultObject

+Config::unobserve = (keyPath) ->
+  Grim.deprecate 'Config::unobserve no longer does anything. Call `.dispose()` on the object returned by Config::observe instead.'
+
 if Grim.includeDeprecatedAPIs
   EmitterMixin = require('emissary').Emitter
   EmitterMixin.includeInto(Config)
@@ -1206,9 +1209,6 @@
   Config::toggle = (keyPath) ->
     Grim.deprecate 'Config::toggle is no longer supported. Please remove from your code.'
     @set(keyPath, not @get(keyPath))
-
-  Config::unobserve = (keyPath) ->
-    Grim.deprecate 'Config::unobserve no longer does anything. Call `.dispose()` on the object returned by Config::observe instead.'

   Config::addScopedSettings = (source, selector, value, options) ->
     Grim.deprecate("Use ::set instead")


Load js fragments in order, so that Subview is loaded before the classes that use it

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/bmedx/modulestore.git/'


add support for non-uniform memory access (ᵔᴥᵔ)

error: pathspec 'roles/hubot/files/scripts/numa.coffee' did not match any file(s) known to git

--- roles/hubot/files/scripts/numa.coffee
+++ roles/hubot/files/scripts/numa.coffee
@@ -0,0 +1,29 @@
+# Description:
+#   Link to fun instructional video on non-uniform memory access
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot numa
+#
+# Notes:
+#   Nu mă, nu mă iei, nu mă, nu mă, nu mă iei.
+#
+# Author:
+#   brianshumate
+
+numaiei = 'https://www.youtube.com/watch?v=60og9gwKh1o'
+
+module.exports = (robot) ->
+  robot.hear /.*(numa).*/i, (msg) ->
+    r = Math.random()
+    if r <= 0.10
+      msg.send numaiei
+
+  robot.respond /numa/i, (msg) ->
+    msg.send numaiei
+


WTF/OTL counter

WTF/OTL counter

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

--- scripts/otl.coffee
+++ scripts/otl.coffee
@@ -0,0 +1,80 @@
+# Description:
+#   Example scripts for you to examine and try out.
+#
+# Notes:
+#   They are commented out by default, because most of them are pretty silly and
+#   wouldn't be useful and amusing enough for day to day huboting.
+#   Uncomment the ones you want to try and experiment with.
+#
+#   These are from the scripting documentation: https://github.com/github/hubot/blob/master/docs/scripting.md
+
+ROOM = "#livingroom"
+TIMEZONE = "Asia/Tokyo"
+REPORT_TIME = "0 0 19 * * 1-5"
+
+cronJob = require('cron').CronJob
+
+addResponse = (res, emoji) ->
+  channel = res.message.rawMessage.channel
+  ts      = res.message.id
+
+  res
+    .http("https://slack.com/api/reactions.add")
+    .query
+      token: process.env.HUBOT_SLACK_TOKEN,
+      name: emoji
+      channel: channel,
+      timestamp: ts
+    .get() (err, resp, body) ->
+      if err?
+        return
+
+module.exports = (robot) ->
+  digitize = (num) ->
+    digits = [
+      "zero"
+      "one"
+      "two"
+      "three"
+      "four"
+      "five"
+      "six"
+      "seven"
+      "eight"
+      "nine"
+    ]
+
+    nums = num.toString()
+    chars = nums.split("")
+    str = ""
+    for char in chars
+      str += ":#{digits[parseInt(char)]}: "
+
+    str
+
+  robot.hear /(wtf|what the fuck|what the hell|what the heck|what the [^ ]+ fuck)/i, (res) ->
+
+    wtfs = robot.brain.get("wtfs") * 1 or 0
+    wtfs = wtfs + 1
+    robot.brain.set("wtfs", wtfs)
+
+    res.send("#{digitize(wtfs)}")
+
+  robot.hear /\bOTL\b/i, (res) ->
+
+    otls = robot.brain.get("otls") * 1 or 0
+    otls = otls + 1
+    robot.brain.set("otls", otls)
+
+    res.send("#{digitize(otls)} orz")
+
+  wtfreport = new cronJob(REPORT_TIME, ->
+                wtfs = robot.brain.get("wtfs") * 1 or 0
+                otls = robot.brain.get("otls") * 1 or 0
+                robot.messageRoom ROOM, "Today's W.T.F.s: #{digitize(wtfs)}, Today's O.T.L.s: #{digitize(otls)}"
+                robot.messageRoom ROOM, "Rastam, go home."
+                robot.brain.set("wtfs", 0)
+                robot.brain.set("otls", 0)
+              null,
+              true,
+              TIMEZONE)


rb-mode for Rakefile, Gemfile, .gemspec, and .ru

--- src/editor.coffee
+++ src/editor.coffee
@@ -50,13 +50,20 @@
     md: 'markdown'
     cs: 'csharp'
     rb: 'ruby'
+    ru: 'ruby'
+    gemspec: 'ruby'
+
+  modeFileMap:
+    Gemfile: 'ruby'
+    Rakefile: 'ruby'

   modeForPath: (path) ->
     return null if not path

-    language = _.last path.split '.'
-    language = language.toLowerCase()
-    modeName = @modeMap[language] or language
+    if not modeName = @modeFileMap[ _.last path.split '/' ]
+      language = _.last path.split '.'
+      language = language.toLowerCase()
+      modeName = @modeMap[language] or language

     try
       require("ace/mode/#{modeName}").Mode


Changed behavior of select option: Use <select> to initialize Multipleter, too

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/saijim/Multipleter.git/'


Remove selective gutter rendering.

Remove selective gutter rendering.

It is faster but incorrect in the case of newlines. It will have to be
rethought. It can be a different unit of work

--- src/gutter.coffee
+++ src/gutter.coffee
@@ -78,22 +78,13 @@
     @renderLineNumbers(intactRanges, renderFrom, renderTo) if performUpdate

   renderLineNumbers: (intactRanges, startScreenRow, endScreenRow) ->
-    editor = @getEditor()
-
-    editor.clearDirtyRanges(intactRanges, @lineNumbers[0], @clearLine)
-    editor.fillDirtyRanges(intactRanges, startScreenRow, endScreenRow, @lineNumbers[0], @buildLineElements)
-
+    @lineNumbers[0].innerHTML = @buildLineElementsHtml(startScreenRow, endScreenRow)
     @firstScreenRow = startScreenRow
     @lastScreenRow = endScreenRow
     @highlightedRows = null
     @highlightLines()

-  clearLine: (lineElement) =>
-    next = lineElement.nextSibling
-    @lineNumbers[0].removeChild(lineElement)
-    next
-
-  buildLineElements: (startScreenRow, endScreenRow) =>
+  buildLineElementsHtml: (startScreenRow, endScreenRow) =>
     editor = @getEditor()
     maxDigits = editor.getLineCount().toString().length
     rows = editor.bufferRowsForScreenRows(startScreenRow, endScreenRow)
@@ -114,9 +105,7 @@

       lastScreenRow = row

-    div = document.createElement('div')
-    div.innerHTML = html
-    new Array(div.children...)
+    html

   removeLineHighlights: ->
     return unless @highlightedLineNumbers


Workspace: Fixed getting subviews of tabbed editor.

--- client/landing/app/CommonViews/workspace/panes/collaborativetabbededitorpane.coffee
+++ client/landing/app/CommonViews/workspace/panes/collaborativetabbededitorpane.coffee
@@ -32,7 +32,7 @@
     @workspaceRef.onDisconnect().remove()  if @workspace.amIHost()

   getActivePaneContent: ->
-    return @tabView.getActivePane().getSubviews()[0].getValue()
+    return @tabView.getActivePane().subViews[0].getValue()

   createEditorTabs: ->
     @tabHandleContainer = new ApplicationTabHandleHolder


Make Model extend Component class and add $register() method.

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/JoshuaToenyes/stout-core.git/'


Improve Foundation class documentation.

Improve Foundation class documentation.


Add git commit setting

Add git commit setting

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/ylansegal/dotfiles.git/'


[optimise] Fix assignements counting as usage

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/'


Added the redis script

Added the redis script

error: pathspec 'src/scripts/redis-brain.coffee' did not match any file(s) known to git

--- src/scripts/redis-brain.coffee
+++ src/scripts/redis-brain.coffee
@@ -0,0 +1,29 @@
+Url   = require "url"
+Redis = require "redis"
+
+# sets up hooks to persist the brain into redis.
+module.exports = (robot) ->
+  info   = Url.parse process.env.REDISTOGO_URL || 'redis://localhost:6379'
+  client = Redis.createClient(info.port, info.hostname)
+
+  if info.auth
+    client.auth info.auth.split(":")[1]
+
+  client.on "error", (err) ->
+    robot.logger.error err
+
+  client.on "connect", ->
+    robot.logger.info "Successfully connected to Redis"
+
+    client.get "hubot:storage", (err, reply) ->
+      if err
+        throw err
+      else if reply
+        robot.brain.mergeData JSON.parse(reply.toString())
+        robot.brain.emit 'load', robot.brain.data
+
+  robot.brain.on 'save', (data) ->
+    client.set 'hubot:storage', JSON.stringify data
+
+  robot.brain.on 'close', ->
+    client.quit()


Only apply new ops locally after modifying an item.

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/lmjohns3/thorax-media.git/'


Components: added wrapper for all content

error: pathspec 'smsgw/static/src/components/components/wrapper.coffee' did not match any file(s) known to git

--- smsgw/static/src/components/components/wrapper.coffee
+++ smsgw/static/src/components/components/wrapper.coffee
@@ -0,0 +1,23 @@
+###
+See for more information
+http://arcturo.github.io/library/coffeescript/07_the_bad_parts.html
+@cjsx React.DOM
+###
+"use strict"
+
+React = require 'react'
+Router = require 'react-router'
+RouteHandler = Router.RouteHandler
+
+module.exports = React.createClass
+
+    render: ->
+        style =
+            position: 'relative'
+            height: '100%'
+            width: '100%'
+
+        content = @props.children
+        content = <RouteHandler /> if not content?
+
+
{content}


payment: added a field for tags to the payment form

+ allow more granular options to be passed to the constructor

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/'


Catch errors in projects.cson

Catch errors in projects.cson

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/douggr/atom-project-manager.git/'


adding map creation logic

adding map creation logic

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/tcarlsen/pixel-moba.git/'


Allow non-authenticated JIRA

Allow non-authenticated JIRA

Currently there is a parse error if the username is blank or if the username fails. This patch doesn't send an authorization header if the username is empty.

--- src/scripts/jira.coffee
+++ src/scripts/jira.coffee
@@ -99,11 +99,12 @@

   get = (msg, where, cb) ->
     console.log(process.env.HUBOT_JIRA_URL + "/rest/api/latest/" + where)
-    authdata = new Buffer(process.env.HUBOT_JIRA_USER+':'+process.env.HUBOT_JIRA_PASSWORD).toString('base64')
-
-    msg.http(process.env.HUBOT_JIRA_URL + "/rest/api/latest/" + where).
-      header('Authorization', 'Basic ' + authdata).
-      get() (err, res, body) ->
+
+    httprequest = msg.http(process.env.HUBOT_JIRA_URL + "/rest/api/latest/" + where)
+    if (process.env.HUBOT_JIRA_USER)
+      authdata = new Buffer(process.env.HUBOT_JIRA_USER+':'+process.env.HUBOT_JIRA_PASSWORD).toString('base64')
+      httprequest = httprequest.header('Authorization', 'Basic ' + authdata)
+    httprequest.get() (err, res, body) ->
         cb JSON.parse(body)

   watchers = (msg, issue, cb) ->


pend my active bids

pend my active bids

--- apps/auctions/routes.coffee
+++ apps/auctions/routes.coffee
@@ -13,7 +13,9 @@
         success: (boolean) -> user.set 'registered_to_bid', boolean
         error: -> user.set 'registered_to_bid', false
       ),
-      metaphysics(query: myActiveBidsQuery, req: user: user)
+      # /api/v1/me/bidder_positions are not 1:1 with "my active bids"
+      # Need to do some filtering to pull out the relavent bidder positions
+      # metaphysics(query: myActiveBidsQuery, req: user: user)
     ]
   else
     Q.promise (resolve) -> resolve()
@@ -34,7 +36,7 @@
       upcomingAuctions: res.locals.sd.UPCOMING_AUCTIONS = auctions.previews()
       promoAuctions: auctions.currentAuctionPromos()
       nextAuction: auctions.next()
-      myActiveBids: userData?[1].me.bidder_positions
+      myActiveBids: userData?[1]?.me.bidder_positions
   )
   .catch(next)
   .done()


Changed port

Changed port

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/ValeryLitvin/crypto-balances.git/'


Added query string parsing Query strings will now be parsed for automatic routes and when calling resolve.

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/legacybass/Simrou.git/'


add ping-listener

add ping-listener

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

--- scripts/ping-listener.coffee
+++ scripts/ping-listener.coffee
@@ -0,0 +1,6 @@
+# Description:
+#   Handles GET /
+
+module.exports = (robot) ->
+  robot.router.get '/', (req, res) ->
+    res.send 'pong'


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/haocheng/hubot-tars-deploy.git/'


[deploy: production]

[deploy: production]

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/domjtalbot/Portfolio.git/'


Remove __shrunk class when adding/removing posts.

--- resources/assets/coffee/forum/topic-ajax.coffee
+++ resources/assets/coffee/forum/topic-ajax.coffee
@@ -24,6 +24,7 @@
     .css
       minHeight: '0px'
       height: currentHeight
+    .removeClass 'js-forum-post__shrunk'
     .slideUp null, ->
       $el.remove()

@@ -66,7 +67,9 @@

     $(document).trigger('osu:page:change')

-    window.forum.endPost().scrollIntoView()
+    newPost = window.forum.endPost()
+    newPost.classList.remove('js-forum-post__shrunk')
+    newPost.scrollIntoView()
   else
     osu.navigate $(data).find('.js-post-url').attr('href')


Replace the Express X-Powered-By

Replace the Express X-Powered-By

--- src/streammachine/core.coffee
+++ src/streammachine/core.coffee
@@ -58,8 +58,12 @@
     #----------

     streamRouter: (req,res,next) ->
+        res.removeHeader("X-Powered-By");
+
         # does the request match one of our streams?
-        if m = ///^\/(#{_u(@streams).keys().join("|")})(?:\.mp3)?$///.exec req.url
+        if m = ///^\/(#{_u(@streams).keys().join("|")})(?:\.mp3)?$///.exec req.url
+            res.header("X-Powered-By","StreamMachine")
+
             console.log "match is ", m[1]
             stream = @streams[ m[1] ]


properly name config

properly name config

--- lib/bot.coffee
+++ lib/bot.coffee
@@ -103,7 +103,7 @@
         text: "Could not fetch your user info from Slack. #{error || ""}"
       )
     else
-      if !settings.enableGuestUsers && (user.is_restricted || user.is_ultra_restricted)
+      if !config.enableGuestUsers && (user.is_restricted || user.is_ultra_restricted)
         context?.replyPrivate(
           text: "Sorry @#{user.name}, as a guest user you're not able to use this command."
         )
@@ -127,7 +127,7 @@

   context = new ReplyContext(defaultBot, bot, message)

-  if match = message.text.match(new RegExp(QUERY_REGEX)) && settings.enableQueryCli
+  if match = message.text.match(new RegExp(QUERY_REGEX)) && config.enableQueryCli
     message.match = match
     runCLI(context, message)
   else if match = message.text.match(new RegExp(FIND_REGEX))
@@ -177,7 +177,7 @@
       • *find* <look search term> — _Shows the top five Looks matching the search._
       """

-      if settings.enableQueryCli
+      if config.enableQueryCli
         defaultText += "• *q* <model_name>/<view_name>/<field>[<filter>] — _Runs a custom query._\n"

       helpAttachments.push(


Fix type linking

Fix type linking

This was catching "e" from Basics

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/'


Use testing frameworks correctly.

Use testing frameworks correctly.

--- tests/dice_test.coffee
+++ tests/dice_test.coffee
@@ -69,11 +69,11 @@
   context 'and rerolls 1s twice, but is having terrible luck', ->
     beforeEach ->
       random_stub = stub(Math, "random")
-      random_stub.onCall().returns(0) # 1
+      random_stub.returns(0) # 1
       room.user.say 'alice', '@hubot roll 4d6 reroll 1 reroll_max 2'

     afterEach ->
       random_stub.restore()

     it 'should return 1s', ->
-      expect(room.messages[1][1]).to.eql "I rolled 1, 1, 1, and 1, making 4."
+      expect(room.messages[1][1]).to.contain "I rolled 1, 1, 1, and 1, making 4."


fix import

fix import

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/serut/spacejam.git/'


fix a new typo

fix a new typo

oh my god

--- lib/dom_utils.coffee
+++ lib/dom_utils.coffee
@@ -18,7 +18,7 @@
       # The document namespace doesn't give (X)HTML elements, so we create them with the correct namespace
       # manually.
       @createElement = (tagName) ->
-        document.createElementNS document, "http://www.w3.org/1999/xhtml", tagName
+        document.createElementNS "http://www.w3.org/1999/xhtml", tagName
       @createElement(tagName)

   #


adds better error handling

adds better error handling

--- src/scripts/getajob.coffee
+++ src/scripts/getajob.coffee
@@ -26,8 +26,14 @@
         msg.send get_a_job response

 get_a_job = (response) ->
-  random_listing = random_choice response.listings.listing
+  listings = response.listings.listing
+
+  if not listings.length
+    return "Sorry, I couldn't find you a job. Guess you're going to be broke for a while!"
+
+  random_listing = random_choice listings
+
   "#{random_listing.title} at #{random_listing.company.name}. Apply at #{random_listing.apply_url or random_listing.apply_email}"

 random_choice = (array) ->
-  array[Math.floor(Math.random() * array.length)]
+  array[Math.floor Math.random() * array.length]


Case-insensitive URL matching

Case-insensitive URL matching

Not sure why this doesn't match lower-case strings, but doesn't seem to work without the flag.

--- src/scripts/shorten.coffee
+++ src/scripts/shorten.coffee
@@ -15,7 +15,7 @@
 #   sleekslush

 module.exports = (robot) ->
-  robot.respond /(bitly|shorten)\s?(me)?\s?(.+)$/, (msg) ->
+  robot.respond /(bitly|shorten)\s?(me)?\s?(.+)$/i, (msg) ->
     msg
       .http("http://api.bitly.com/v3/shorten")
       .query


Adding the standup script

Adding the standup script

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

--- src/scripts/standup.coffee
+++ src/scripts/standup.coffee
@@ -0,0 +1,115 @@
+# Agile standup bot ala tender
+#
+# standup? - show help for standup
+
+module.exports = (robot) ->
+  robot.respond /(?:cancel|stop) standup *$/i, (msg) ->
+    delete robot.brain.data.standup?[msg.message.user.room]
+    msg.send "Standup cancelled"
+
+  robot.respond /standup for (.*) *$/i, (msg) ->
+    room  = msg.message.user.room
+    group = msg.match[1].trim()
+    if robot.brain.data.standup?[room]
+      msg.send "The standup for #{robot.brain.data.standup[room].group} is in progress! Cancel it first with 'cancel standup'"
+      return
+
+    attendees = []
+    for own key, user of robot.brain.data.users
+      roles = user.roles or [ ]
+      if "a #{group} member" in roles or "an #{group} member" in roles or "a member of #{group}" in roles
+        attendees.push user
+    if attendees.length > 0
+      robot.brain.data.standup or= {}
+      robot.brain.data.standup[room] = {
+        group: group,
+        start: new Date().getTime(),
+        attendees: attendees,
+        remaining: shuffleArrayClone(attendees)
+        log: [],
+      }
+      who = attendees.map((user) -> user.name).join(', ')
+      msg.send "Ok, let's start the standup: #{who}"
+      nextPerson robot, room, msg
+    else
+      msg.send "Oops, can't find anyone with 'a #{group} member' role!"
+
+  robot.respond /(?:that\'s it|next(?: person)?|done) *$/i, (msg) ->
+    unless robot.brain.data.standup?[msg.message.user.room]
+      return
+    if robot.brain.data.standup[msg.message.user.room].current.id isnt msg.message.user.id
+      msg.reply "but it's not your turn! Use skip [someone] or next [someone] instead."
+    else
+      nextPerson robot, msg.message.user.room, msg
+
+  robot.respond /(skip|next) (.*) *$/i, (msg) ->
+    unless robot.brain.data.standup?[msg.message.user.room]
+      return
+
+    is_skip = msg.match[1] == 'skip'
+    users = robot.usersForFuzzyName msg.match[2]
+    if users.length is 1
+      skip = users[0]
+      standup = robot.brain.data.standup[msg.message.user.room]
+      if is_skip
+        standup.remaining = (user for user in standup.remaining when user.name != skip.name)
+        if standup.current.id is skip.id
+          nextPerson robot, msg.message.user.room, msg
+        else
+          msg.send "Ok, I will skip #{skip.name}"
+      else
+        if standup.current.id is skip.id
+          standup.remaining.push skip
+          nextPerson robot, msg.message.user.room, msg
+        else
+          msg.send "But it is not #{skip.name}'s turn!"
+    else if users.length > 1
+      msg.send "Be more specific, I know #{users.length} people named like that: #{(user.name for user in users).join(", ")}"
+    else
+      msg.send "#{msg.match[2]}? Never heard of 'em"
+
+  robot.respond /standup\?? *$/i, (msg) ->
+    msg.send """
+             <who> is a member of <team> - tell hubot who is the member of <team>'s standup
+             standup for <team> - start the standup for <team>
+             cancel standup - cancel the current standup
+             next - say when your updates for the standup is done
+             skip <who> - skip someone when they're not available
+             """
+
+  robot.catchAll (msg) ->
+    unless robot.brain.data.standup?[msg.message.user.room]
+      return
+    robot.brain.data.standup[msg.message.user.room].log.push { message: msg.message, time: new Date().getTime() }
+
+shuffleArrayClone = (array) ->
+  cloned = []
+  for i in (array.sort -> 0.5 - Math.random())
+    cloned.push i
+  cloned
+
+nextPerson = (robot, room, msg) ->
+  standup = robot.brain.data.standup[room]
+  if standup.remaining.length == 0
+    howlong = calcMinutes(new Date().getTime() - standup.start)
+    msg.send "All done! Standup was #{howlong}."
+    robot.brain.emit 'standupLog', standup.group, room, msg, standup.log
+    delete robot.brain.data.standup[room]
+  else
+    standup.current = standup.remaining.shift()
+    msg.send "#{addressUser(standup.current.name, robot.adapter)} your turn"
+
+addressUser = (name, adapter) ->
+  className = adapter.__proto__.constructor.name
+  switch className
+    when "HipChat" then "@#{name.replace(' ', '')}"
+    else "#{name}:"
+
+calcMinutes = (milliseconds) ->
+  seconds = Math.floor(milliseconds / 1000)
+  if seconds > 60
+    minutes = Math.floor(seconds / 60)
+    seconds = seconds % 60
+    "#{minutes} minutes and #{seconds} seconds"
+  else
+    "#{seconds} seconds"


Make Promises/A+ compliance tests a promise tests subset.

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/JoshuaToenyes/stout-core.git/'


Added surface module for handling ND arrays representing surfaces.

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

--- src/surface.coffee
+++ src/surface.coffee
@@ -0,0 +1,12 @@
+nd = require('./ndarray')
+
+computeUVs = (arr) ->
+    return
+
+
+computeNormals = (arr) ->
+    return
+
+
+computeFaceIndices = (arr) ->
+    return


chore (Router) Better scenario descriptions

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/'


oops

oops

‘extends ScrollView

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/nahberry/tudu-list.git/'


Add ratelimit wrapper for approving api calls

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/Arm1stice/prosu.git/'


Test Docas.io

Test Docas.io

--- test/1.test.coffee
+++ test/1.test.coffee
@@ -1,7 +1,8 @@
 {exec} = require 'child_process'
 should = require 'should'
+{clear_queue, enqueue_tasks, clean_up, check_result}= require './shared_steps'
+
 fairy  = require("..").connect()
-{clear_queue, enqueue_tasks, clean_up, check_result}= require './shared_steps'
 task_name = 'TEST1'
 queue     = fairy.queue task_name


CMS.Views.Week is tested

CMS.Views.Week is tested

error: pathspec 'cms/static/coffee/spec/views/week_spec.coffee' did not match any file(s) known to git

--- cms/static/coffee/spec/views/week_spec.coffee
+++ cms/static/coffee/spec/views/week_spec.coffee
@@ -0,0 +1,71 @@
+describe "CMS.Views.Week", ->
+  beforeEach ->
+    setFixtures """
+

+

+        <textarea class="editable-textarea"></textarea>
+        edit
+

+

+

+

+

+      """
+    CMS.unbind()
+
+  describe "render", ->
+    beforeEach ->
+      spyOn(CMS.Views, "Module").andReturn(jasmine.createSpyObj("Module", ["render"]))
+      $.fn.inlineEdit = jasmine.createSpy("$.fn.inlineEdit")
+      @view = new CMS.Views.Week(el: $("#week"), height: 100).render()
+
+    it "set the height of the element", ->
+      expect(@view.el).toHaveCss(height: "100px")
+
+    it "make .editable as inline editor", ->
+      expect($.fn.inlineEdit.calls[0].object.get(0))
+        .toEqual($(".editable").get(0))
+
+    it "make .editable-test as inline editor", ->
+      expect($.fn.inlineEdit.calls[1].object.get(0))
+        .toEqual($(".editable-textarea").get(0))
+
+    it "create module subview for each module", ->
+      expect(CMS.Views.Module.calls[0].args[0])
+        .toEqual({ el: $("#module-one").get(0) })
+      expect(CMS.Views.Module.calls[1].args[0])
+        .toEqual({ el: $("#module-two").get(0) })
+
+  describe "edit", ->
+    beforeEach ->
+      @view = new CMS.Views.Week(el: $("#week"), height: 100).render()
+      spyOn(CMS, "replaceView")
+      spyOn(CMS.Views, "WeekEdit")
+        .andReturn(@view = jasmine.createSpy("Views.WeekEdit"))
+      spyOn(CMS.Models, "Week")
+        .andReturn(@model = jasmine.createSpy("Models.Week"))
+      $(".week-edit").click()
+
+    it "replace the content with edit week view", ->
+      expect(CMS.replaceView).toHaveBeenCalledWith @view
+      expect(CMS.Views.WeekEdit).toHaveBeenCalledWith model: @model
+      expect(CMS.Models.Week).toHaveBeenCalledWith
+        id: "i4x://mitx.edu/course/week"
+
+  describe "on content.show", ->
+    beforeEach ->
+      @view = new CMS.Views.Week(el: $("#week"), height: 100).render()
+      @view.$el.height("")
+      @view.setHeight()
+
+    it "set the correct height", ->
+      expect(@view.el).toHaveCss(height: "100px")
+
+  describe "on content.hide", ->
+    beforeEach ->
+      @view = new CMS.Views.Week(el: $("#week"), height: 100).render()
+      @view.$el.height("100px")
+      @view.resetHeight()
+
+    it "remove height from the element", ->
+      expect(@view.el).not.toHaveCss(height: "100px")


let the children techno

let the children techno

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/'


I'm starting to confuse myself now.

I'm starting to confuse myself now.

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/damianb/crimson.git/'


break apart list of files string into array

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/noprob.git/'


[fun] [fix] percents are better than fight levels


book base

book base

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/Bit18/cyoab_modular_repo.git/'


[enh] Add local_watcher tests

[enh] Add local_watcher tests

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

--- tests/local_watcher.coffee
+++ tests/local_watcher.coffee
@@ -0,0 +1,92 @@
+fs = require 'fs-extra'
+touch = require 'touch'
+date = require 'date-utils'
+mkdirp = require 'mkdirp'
+async = require 'async'
+
+path = require 'path'
+should = require 'should'
+helpers = require './helpers/helpers'
+cliHelpers = require './helpers/cli'
+fileHelpers = require './helpers/files'
+folderHelpers = require './helpers/folders'
+client = helpers.getClient()
+
+config = require '../backend/config'
+pouch = require '../backend/db'
+localWatcher = require '../backend/local_event_watcher'
+{syncPath} = helpers.options
+
+describe "LocalWatcher Tests", ->
+    @timeout 8000
+
+    before cliHelpers.resetDatabase
+    before cliHelpers.initConfiguration
+    before fileHelpers.deleteAll
+    after cliHelpers.resetDatabase
+
+    describe "init", ->
+        localFiles = [
+            {name: 'localfile-01', parent: ''}
+            {name: 'localfile-02', parent: '/localfolder-01'}
+            {name: 'localfile-03', parent: '/localfolder-01/localsub-01'}
+        ]
+        localFolders = [
+            {name: 'localfolder-01', parent: ''}
+            {name: 'localsub-01', parent: '/localfolder-01'}
+        ]
+
+        # Launch local event watcher
+        before (done) ->
+            localWatcher.start()
+            setTimeout (-> done()), 2000
+
+        # Create local folders
+        before ->
+            localFolders.forEach (folder) ->
+                mkdirp.sync path.join syncPath, folder.parent, folder.name
+
+        # Create local files
+        before ->
+            localFiles.forEach (file) ->
+                touch.sync path.join syncPath, file.parent, file.name
+
+        # Wait for files to be uploaded
+        before (done) ->
+            setTimeout (-> done()), 5000
+
+
+        it "all files are present remotely", (done) ->
+            fileHelpers.getAll (err, files) ->
+                should.not.exist err
+
+                fileHash = {}
+                files.forEach (file) ->
+                    fileHash[path.join file.path, file.name] = true
+
+                localFiles.forEach (file) ->
+                    fileHash[path.join file.parent, file.name].should.be.ok
+
+                done()
+
+        it "and all folders are present remotely", (done) ->
+            folderHelpers.getAll (err, folders) ->
+                should.not.exist err
+
+                folderHash = {}
+                folders.forEach (folder) ->
+                    folderHash[path.join folder.path, folder.name] = true
+
+                localFolders.forEach (folder) ->
+                    folderPath = path.join folder.parent, folder.name
+                    folderHash[folderPath].should.be.ok
+
+                done()
+
+        it "and all files/folders are present locally", ->
+            localFolders.forEach (folder) ->
+                folderPath = path.join syncPath, folder.parent, folder.name
+                fs.existsSync(folderPath).should.be.ok
+            localFiles.forEach (file) ->
+                filePath = path.join syncPath, file.parent, file.name
+                fs.existsSync(filePath).should.be.ok


Cache Recurly plans, wip.

Cache Recurly plans, wip.

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/'


switch to KD.showError

switch to KD.showError


get tags is safe

get tags is safe

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/'


Revert "reload page if appcache reloads within 1 second"

This reverts commit 6ca361c22bed0b97e211cf237d2952ea44487b13.

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/'


JStackTemplate: simplify update flow, use new validator

--- workers/social/lib/social/models/computeproviders/stacktemplate.coffee
+++ workers/social/lib/social/models/computeproviders/stacktemplate.coffee
@@ -510,64 +510,66 @@

       { group }    = client.r
       { delegate } = client.connection
+      originId     = delegate.getId()
+      options      = { originId, group }
+
+      notifyOptions =
+        account : delegate
+        group   : group.slug
+        target  : if @accessLevel is 'group' then 'group' else 'account'
+
+      updateAndNotify = (query) =>
+        @updateAndNotify notifyOptions, query, (err, results) =>
+          callback err, this

       # It's not allowed to change a stack template group or owner
       delete data.originId
       delete data.group

+      delete data.title  if data.title is @getAt 'title'
+
       # Update template sum if template update requested
-      { config, slug, template, templateDetails, rawContent } = data
-
-      async.series [
-
-        (next) =>
-          return next()  unless template?
-
-          validateTemplateData data, group, (err, replacements) =>
-            return next err  if err
-
-            # update template object, sum, rawContent etc.
-            data.template = replacements.template
-
-            # Keep the existing template details if not provided
-            if not templateDetails?
-              data.template.details = @getAt 'template.details'
-
-            # Keep last updater info in the template details
-            data.template.details.lastUpdaterId = delegate.getId()
-
-            # add required providers/fields on to config from template
-            data.config = replacements.config
-
-            # update slug
-            data.slug = replacements.slug  if slug
-
-            delete data.templateDetails
-            delete data.rawContent
-
-            data['meta.modifiedAt'] = new Date
-
-            originalId = data.config?.clonedFrom
-            return next()  unless originalId
-
-            # update clonedSum information in the template, if it is exists
-            JStackTemplate.one$ client, { _id: originalId }, (err, template) ->
-              if template and not err
-                if template.template.sum is data.template.sum
-                  data.config.clonedSum = template.template.sum
-              next()
-
-        (next) =>
-          query = { $set: data }
-
-          notifyOptions =
-            account : delegate
-            group   : group.slug
-            target  : if @accessLevel is 'group' then 'group' else 'account'
-
-          @updateAndNotify notifyOptions, query, next
-
-      ], (err, results) => callback err, this
+      { config, title, template, templateDetails, rawContent } = data
+
+      validateTemplateData data, options, (err, replacements) =>
+        return callback err  if err
+
+        if template
+          # update template object, sum, rawContent etc.
+          data.template = replacements.template
+
+          # Keep the existing template details if not provided
+          if not templateDetails?
+            data.template.details = @getAt 'template.details'
+
+          # Keep last updater info in the template details
+          data.template.details.lastUpdaterId = delegate.getId()
+
+        if config
+          # add required providers/fields on to config from template
+          data.config = replacements.config
+
+        delete data.templateDetails
+        delete data.rawContent
+        delete data.slug
+
+        if title
+          data.title = replacements.title
+          data.slug  = replacements.slug
+
+        data['meta.modifiedAt'] = new Date
+
+        if originalId = data.config?.clonedFrom
+
+          # update clonedSum information in the template, if it is exists
+          JStackTemplate.one$ client, { _id: originalId }, (err, template) ->
+            if template and not err
+              if template.template.sum is data.template.sum
+                data.config.clonedSum = template.template.sum
+            updateAndNotify { $set: data }
+
+        else
+          updateAndNotify { $set: data }

   cloneCustomCredentials = (client, credentials, callback) ->


test id fn on heroku

test id fn on heroku

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/jonasby/trello-sprints.git/'


chore(index): delete unused code

chore(index): delete unused code

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/keboola/kbc-ui-ex-twitter.git/'


Closes #42; Added option for painting zero values to the heatmap.

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/kidaa/epoch.git/'


Added a code alias of `coffee` for `coffeescript`

--- .metalsmith/metal.coffee
+++ .metalsmith/metal.coffee
@@ -27,6 +27,10 @@
 titleify     = require './plugins/titleify'
 videoScraper = require './plugins/video-scraper'

+
+# Configure highlightjs with some language aliases
+highlightjs.registerLanguage 'coffee', (hljs) ->
+  hljs.getLanguage('coffeescript')

 # ## build


Slight refactoring; added comments about what is going on. :)

--- app/assets/javascripts/backbone/kandan.js.coffee
+++ app/assets/javascripts/backbone/kandan.js.coffee
@@ -61,11 +61,9 @@
       Kandan.Helpers.Utils.browserTabFocused = false
     )

-
   initBroadcasterAndSubscribe: ()->
     Kandan.broadcaster = eval "new Kandan.Broadcasters.#{@options().broadcaster.name}Broadcaster()"
     Kandan.broadcaster.subscribe "/channels/*"
-    @registerAppEvents()

   initTabs: ()->
     $('#kandan').tabs({
@@ -107,17 +105,21 @@
     chatArea = new Kandan.Views.ChatArea({channels: channels})
     $(".main-area").append(chatArea.render().el)

-
-  onFetchUsers: (callback) ->
-    (users) =>
-      Kandan.Helpers.Users.setFromCollection(users)
+  onFetchChannels: (callback) ->
+    (channels) ->
+      Kandan.Helpers.Channels.setCollection(channels)
       callback()

   onFetchActiveUsers: (callback) ->
-    (activeUsers) =>
+    (activeUsers) ->
       if not Kandan.Helpers.ActiveUsers.collectionHasCurrentUser(activeUsers)
         activeUsers.add([Kandan.Helpers.Users.currentUser()])
       Kandan.Helpers.ActiveUsers.setFromCollection(activeUsers)
+      callback()
+
+  onFetchUsers: (callback) ->
+    (users) ->
+      Kandan.Helpers.Users.setFromCollection(users)
       callback()

   registerUtilityEvents: ()->
@@ -127,34 +129,36 @@
     , @options().timestamp_refresh_interval)

   init: ->
-    initializer = @createCallback 3, =>
-      Kandan.registerPlugins()
+    asyncInitializers = [
+      (callback) => new Kandan.Collections.Channels().fetch { success: @onFetchChannels(callback) }
+      (callback) => new Kandan.Collections.ActiveUsers().fetch { success: @onFetchActiveUsers(callback) }
+      (callback) => new Kandan.Collections.Users().fetch { success: @onFetchUsers(callback) }
+    ]
+    # The initializer callback should only be called after all
+    # asynchronous initialization has been completed.
+    syncInitializer = @callAfter asyncInitializers.length, =>
+      @registerPlugins()
       Kandan.Plugins.initAll()
-      Kandan.initChatArea(Kandan.Helpers.Channels.getCollection())
-      Kandan.initTabs()
+      @initChatArea(Kandan.Helpers.Channels.getCollection())
+      @initTabs()
       Kandan.Widgets.initAll()
       Kandan.Helpers.Channels.scrollToLatestMessage()
       Kandan.Plugins.Mentions.initUsersMentions(Kandan.Helpers.ActiveUsers.all())
       Kandan.Plugins.Emojis.attachToChatbox()
-      return

-    new Kandan.Collections.Channels().fetch {
-      success: @onFetchChannels(initializer)
-    }
-    new Kandan.Collections.ActiveUsers().fetch {
-      success: @onFetchActiveUsers(initializer)
-    }
-    new Kandan.Collections.Users().fetch {
-      success: @onFetchUsers(initializer)
-    }
+    # Call the asynchronous initializers, passing the synchronous
+    # initializer in as the callback to execute after all asynchrnous
+    # initialization is complete.
+    _(asyncInitializers).each (f) -> f.call(@, syncInitializer)
+
+    # The following intiialization routines don't require deferred
+    # initialization and can be executed immediately.
     @registerUtilityEvents()
     @initBroadcasterAndSubscribe()
+    @registerAppEvents()

-  createCallback: (limit, callback)->
+  # Create a function that is fired only after it has been attempted
+  # `limit` times.
+  callAfter: (limit, callback) ->
     finishedCalls = 0
     -> callback() if ++finishedCalls == limit
-
-  onFetchChannels: (callback) ->
-    (channels) =>
-      Kandan.Helpers.Channels.setCollection(channels)
-      callback()


add hand valuator

add hand valuator

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

--- src/valueHand.coffee
+++ src/valueHand.coffee
@@ -0,0 +1,25 @@
+_ = require 'lodash'
+
+module.exports = (allCards) ->
+  variance = 8 - allCards.length
+
+  pairs = _ myHand.all
+  .groupBy (card) -> card.rankString
+  .filter (group) -> group.length > 1
+  .value()
+
+  cpairs = _ myHand.community
+  .groupBy (card) -> card.rankString
+  .filter (group) -> group.length > 1
+  .value()
+
+  myPairs = pairs.length - cpairs.length
+
+  value = 0
+
+  if myPairs > 0
+    value = 100
+
+  if value > 0
+    value /= variance
+  value


Improve feature detection to show non-support to make styling less override-ey.

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/lonelyplanet/rizzo.git/'


fix whenHidden/whenVisible examples, document params.onValue

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/'


drawPanelText extraction

drawPanelText extraction

--- scripts/ayp.coffee
+++ scripts/ayp.coffee
@@ -188,6 +188,31 @@
           for obj in names
             avatars[obj.name] = obj.img
           cb(null, avatars)
+
+# Draw the text into a `frame` described by
+# `lines`.
+# No character drawing is done, just bubbles being placed.
+# The avatars should already be painted, in case the text
+# needs to overlap them.
+drawPanelText = (frame, lines) ->
+  # I can render all the text unconditionally
+  # since it looks the same regardless of the number
+  # of speakers. (i.e. left -> right, top -> bottom)
+  first = true
+  top = 0
+  left = AYP_BUBBLE_PADDING_HORIZONTAL
+  topPad = AYP_BUBBLE_PADDING_VERTICAL
+  for line in lines
+    [who, what] = line
+    bubble = textBubble what
+
+    if not first
+      left = frame.width - bubble.width - AYP_BUBBLE_PADDING_HORIZONTAL
+    else
+      first = false
+
+    compositeImage frame, bubble, left, top
+    top += bubble.height + topPad

 # Build a single panel out of (UP TO) two lines of dialog
 # cb invoked as `cb(err, image)`. `err` is only set on failure
@@ -232,24 +257,9 @@

         compositeImage frame, char, left, top

-    # I can render all the text unconditionally
-    # since it looks the same regardless of the number
-    # of speakers. (i.e. left -> right, top -> bottom)
-    first = true
-    top = 0
-    left = AYP_BUBBLE_PADDING_HORIZONTAL
-    topPad = AYP_BUBBLE_PADDING_VERTICAL
-    for line in lines
-      [who, what] = line
-      bubble = textBubble what
-
-      if not first
-        left = frame.width - bubble.width - AYP_BUBBLE_PADDING_HORIZONTAL
-
-      compositeImage frame, bubble, left, top
-
-      top += bubble.height + topPad
-      first = false if first
+    # Add the text after all the avatars are painted on
+    drawPanelText frame, lines
+
     # Return the frame to the caller from `namesReady`
     return cb(false, frame)


Rails is looking for an empty global/index.coffee

Reason: unknown

error: pathspec 'app/assets/javascripts/pano/global/index.coffee' did not match any file(s) known to git


add HTTP URI

add HTTP URI

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

--- scripts/uri/http.coffee
+++ scripts/uri/http.coffee
@@ -0,0 +1,7 @@
+Generic = require 'uri/generic'
+
+exports = class HTTP extends Generic
+  PORTS = http: 80, https: 443
+  constructor: (uri) ->
+    super
+    @defaultPort = PORTS[@scheme]


Admin: Logs: LogsItemView

Admin: Logs: LogsItemView

error: pathspec 'client/admin/lib/views/logs/logsitemview.coffee' did not match any file(s) known to git

--- client/admin/lib/views/logs/logsitemview.coffee
+++ client/admin/lib/views/logs/logsitemview.coffee
@@ -0,0 +1,26 @@
+kd      = require 'kd'
+JView   = require 'app/jview'
+timeago = require 'timeago'
+
+
+module.exports = class LogsItemView extends kd.ListItemView
+
+  JView.mixin @prototype
+
+  constructor: (options = {}, data) ->
+
+    options.type or= 'member'
+
+    super options, data
+
+
+  pistachio: ->
+
+    { createdAt } = @getData()
+
+    """
+

+
{code{#(message)}}

+
Logged #{timeago createdAt}

+

+    """


video: add helper

video: add helper

error: pathspec 'client/app/lib/videocollaboration/helper.coffee' did not match any file(s) known to git

--- client/app/lib/videocollaboration/helper.coffee
+++ client/app/lib/videocollaboration/helper.coffee
@@ -0,0 +1,77 @@
+$ = require 'jquery'
+
+###*
+ * It makes a request to the backend and gets session id
+ * and creates a session with that session id.
+ *
+ * TODO: add proper error handling
+ *
+ * @param {SocialChannel} channel - Session will be generated based on channel.
+ * @param {function(session: object)} callback - it will be called on success.
+###
+generateSession = (channel, callback) ->
+
+  $.ajax
+    url      : '/-/video-chat/session'
+    method   : 'post'
+    dataType : 'JSON'
+    data     : { channelId: channel.id }
+    success  : callback
+
+
+###*
+ * It makes a request to the backend and gets the token for given session id.
+ *
+ * TODO: add proper error handling and expireTime support.
+ *
+ * @param {string} options.sessionId - session id for token to be generated.
+ * @param {string=} options.role - role of user in video chat.  (e.g 'publisher', 'moderator')
+ * @param {number=} options.expireTime - expiration time for a token. Needs to be lower than 30 days.
+ * @param {function(token: string)} callback - callback to be called with token from backend.
+ * @see {@link https://tokbox.com/opentok/concepts/token_creation.html}
+###
+generateToken = (options, callback) ->
+
+  { sessionId, role } = options
+
+  role or= 'publisher'
+
+  $.ajax
+    url      : "/-/video-chat/token"
+    method   : 'post'
+    dataType : 'JSON'
+    data     : { role, sessionId }
+    success  : (options) -> callback options.token
+
+
+###*
+ * Transforms map with `connectionId`s as keys into a map
+ * with nicknames as key.
+ *
+ * @param {object<string, ParticipantType.Subscriber>} subscribers - keys are connectionIds.
+ * @param {ParticipantType.Publisher} publisher
+###
+toNickKeyedMap = (subscribers, publisher) ->
+
+  map = {}
+  map[subscriber.nick] = subscriber  for own cId, subscriber of subscribers
+  map[publisher.nick] = publisher
+  return map
+
+
+###*
+ * Default error signal.
+ *
+ * @param {object} error
+###
+_errorSignal = (error) ->
+
+  console.error "signal error #{error.reason}"  if error
+
+
+module.exports = {
+  generateSession
+  generateToken
+  toNickKeyedMap
+  _errorSignal
+}


submenu/visibility: Add visibility submenu.

error: pathspec 'Oghma/submenu/visibility.coffee' did not match any file(s) known to git

--- Oghma/submenu/visibility.coffee
+++ Oghma/submenu/visibility.coffee
@@ -0,0 +1,68 @@
+
+# Copyright 2010-2013 Christopher Alfeld
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+Oghma = @Oghma ?= {}
+Oghma.SubMenu ?= {}
+
+# Visibility sub menu.
+#
+# This is a dynamic menu so the items should be called and added on menu
+# display.
+#
+# @param [Oghma.App] O App.
+# @param [Oghma.Thingy] thingy Thingy to set visiblity o.f
+# @param [string] key Visible to key.  Default: 'visible_to'.
+# @return [Array<Object>] Menu items to add.
+#
+# @author Christopher Alfeld (calfeld@calfeld.net)
+# @copyright 2013 Christopher Alfeld
+Oghma.SubMenu.visibility = ( O, thingy, key = 'visible_to' ) ->
+  value = thingy.gets( key )
+  items = []
+  set = ( value ) ->
+    attrs = {}
+    attrs[ key ] = value
+    thingy.set( attrs )
+
+  if value.length == 0
+    items.push(
+      text: 'Make private to me.'
+      handler: -> set( [ O.me().gets('name') ] )
+    )
+  else
+    items.push(
+      text: 'Make public.'
+      handler: -> set( [] )
+    )
+
+  O.allverse.user.each_name( ( name ) ->
+    items.push(
+      text: name
+      checked: value.indexOf( name ) != -1
+      handler: ->
+        i = value.indexOf( name )
+        if i != -1
+          value.splice( i, 1 )
+        else
+          value.push( name )
+        set( value )
+    )
+  )
+
+  items
+
+
+
+


Added a check for empty JName resultsets.


Auto-focus the first field

Auto-focus the first field

error: pathspec 'app/assets/javascripts/helpers.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/helpers.js.coffee
+++ app/assets/javascripts/helpers.js.coffee
@@ -0,0 +1,5 @@
+do ($=jQuery) ->
+  $(document).on("page:update", ->
+    $('form :input:visible').first().focus()
+  )
+


Very simple away message

Very simple away message

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

--- src/scripts/away.coffee
+++ src/scripts/away.coffee
@@ -0,0 +1,20 @@
+# Description:
+#   Allows Hubot to do mathematics.
+#
+# Commands:
+#   hubot math me <expression> - Calculate the given expression.
+#   hubot convert me <expression> to <units> - Convert expression to given units.
+module.exports = (robot) ->
+  robot.respond /(.*)/i, (msg) ->
+    token = process.env.HIPCHAT_API_TOKEN
+    msg
+      .http('https://api.hipchat.com/v1/users/list?format=json&auth_token=' + token)
+      .get() (err, res, body) ->
+        json = eval("(#{body})")
+        for u in json.users
+          if u.name == robot.adapter.bot.name and u.status == "dnd"
+            robot.adapter.enableSlash == true
+            console.log robot.adapter
+            msg.send "QUIT TALKING TO ME I'M DND"
+            robot.adapter.bot.setAvailability('dnd')
+


Teamwork: Set modal reference to delegate to remove it later.


removed unused file from site.landing folder


add VIF management

add VIF management

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

--- src/api/vif.coffee
+++ src/api/vif.coffee
@@ -0,0 +1,54 @@
+{$wait} = require '../fibers-utils'
+
+#=====================================================================
+
+exports.delete = ({id}) ->
+  try
+    VIF = @getObject id, 'VIF'
+  catch
+    @throw 'NO_SUCH_OBJECT'
+
+  xapi = @getXAPI VIF
+
+  # TODO: check if VIF is attached before
+  $wait xapi.call 'VIF.destroy', VIF.ref
+
+  return true
+exports.delete.permission = 'admin'
+exports.delete.params = {
+  id: { type: 'string' }
+}
+
+exports.disconnect = ({id}) ->
+  try
+    VIF = @getObject id, 'VIF'
+  catch
+    @throw 'NO_SUCH_OBJECT'
+
+  xapi = @getXAPI VIF
+
+  # TODO: check if VIF is attached before
+  $wait xapi.call 'VIF.unplug_force', VIF.ref
+
+  return true
+exports.disconnect.permission = 'admin'
+exports.disconnect.params = {
+  id: { type: 'string' }
+}
+
+exports.connect = ({id}) ->
+  try
+    VIF = @getObject id, 'VIF'
+  catch
+    @throw 'NO_SUCH_OBJECT'
+
+  xapi = @getXAPI VIF
+
+  # TODO: check if VIF is attached before
+  $wait xapi.call 'VIF.plug', VIF.ref
+
+  return true
+exports.disconnect.permission = 'admin'
+exports.disconnect.params = {
+  id: { type: 'string' }
+}


realtimecontroller lower race condition probability

--- client/app/lib/realtimecontroller.coffee
+++ client/app/lib/realtimecontroller.coffee
@@ -347,34 +347,33 @@

       @eventCache[eventId] = yes

+    # no need to emit any events when not subscribed
+    return  unless @channels[channel]
+
+    # instance events are received via public channel. For this reason
+    # if an event name includes "instance-", update the related message channel
+    # An instance event format is like "instance-5dc4ce55-b159-11e4-8329-c485b673ee34.ReplyAdded" - ctf
+
+    if eventName.indexOf("instance-") < 0
+      body.channelId = @channels[channel].channelId
+      return @channels[channel].emit eventName, body
+
+    events = eventName.split "."
+    if events.length < 2
+      warn 'could not parse event name', eventName
+      return
+
+    [instanceChannel, eventName] = events
+
+    return  unless @channels[instanceChannel]
+
+    @channels[instanceChannel].emit eventName, body

     # when a user is connected in two browsers, and leaves a channel, in second one
     # they receive RemovedFromChannel event for their own. Therefore we must unsubscribe
     # user from all connected devices.
     if eventName is 'RemovedFromChannel' and body.accountId is whoami().socialApiId
       return @unsubscribeChannel message.channel
-
-    # no need to emit any events when not subscribed
-    return  unless @channels[channel]
-
-    # instance events are received via public channel. For this reason
-    # if an event name includes "instance-", update the related message channel
-    # An instance event format is like "instance-5dc4ce55-b159-11e4-8329-c485b673ee34.ReplyAdded" - ctf
-
-    if eventName.indexOf("instance-") < 0
-      body.channelId = @channels[channel].channelId
-      return @channels[channel].emit eventName, body
-
-    events = eventName.split "."
-    if events.length < 2
-      warn 'could not parse event name', eventName
-      return
-
-    [instanceChannel, eventName] = events
-
-    return  unless @channels[instanceChannel]
-
-    @channels[instanceChannel].emit eventName, body

   handleError: (err) ->


Remove comment line

Remove comment line

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/'


upgrade functions now pass through service instance

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/'


Fix screen sharing bug when receiving audio call. issue #5286

--- packages/rocketchat-webrtc/WebRTCClass.coffee
+++ packages/rocketchat-webrtc/WebRTCClass.coffee
@@ -160,7 +160,7 @@
 		@screenShareAvailable = @navigator in ['chrome', 'firefox']

 		@media =
-			video: true
+			video: false
 			audio: true

 		@transport = new @transportClass @


forgot to add cli/run.coffee

forgot to add cli/run.coffee

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

--- src/cli/run.coffee
+++ src/cli/run.coffee
@@ -0,0 +1,26 @@
+path = require 'path'
+
+class Run extends require("./base")
+  name: "run"
+
+  summary: "Runs a built project."
+
+  doc: """
+  fork2 run [PROJECT_BUILD_PATH] [--port PORT]
+
+  PROJECT_BUILD_PATH defaults to curren working directory
+  """
+
+  configParser: ->
+    @parser
+      .describe("port","http port for server to listen on")
+      .default("port",3000)
+
+  run: (args) ->
+    args = @parse(args)
+    contentRoot = path.normalize(args._[0] || process.cwd())
+    app = require("../server/app").create
+      contentRoot: contentRoot
+    app.start(args.port)
+
+module.exports = new Run()


changed to internal getKeys function

changed to internal getKeys function

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/'


shuffle scenario descriptions to remove redundant 'model' part


Fix major error in rendering promise resolution.

This bug would cause rendering promises for parent nodes to fulfill
before their children were rendered. This fix corrects that 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/JoshuaToenyes/stout-client.git/'


Don't explode the array

Don't explode the array

--- src/workspace.coffee
+++ src/workspace.coffee
@@ -77,7 +77,7 @@
   #
   # Returns an {Array} of {Editor}s.
   getEditors: ->
-    _.clone(@editors...)
+    _.clone(@editors)

   # Public: Open a given a URI in Atom asynchronously.
   #


Stub tests with sanity

Stub tests with sanity

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

--- tests/rc_test.coffee
+++ tests/rc_test.coffee
@@ -0,0 +1,21 @@
+assert = require 'assert'
+
+Helper = require('hubot-test-helper')
+
+helper = new Helper('../scripts/rc.coffee')
+expect = require('chai').expect
+stub = require('sinon').stub
+
+describe 'Roll Call', ->
+  room = null
+  random_stub = null
+
+  beforeEach ->
+    room = helper.createRoom()
+
+  context 'sanity', ->
+    beforeEach ->
+      room.user.say 'alice', '@hubot rc ping'
+
+    it 'compiled if it got this fucking far', ->
+      assert room.messages.length > 0


bug fix

bug fix


added ex-telfa

added ex-telfa

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/keboola/kbc-ui-wrapper.git/'


Define tests (without implementation)

Define tests (without implementation)

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

--- test/node_gyp.coffee
+++ test/node_gyp.coffee
@@ -0,0 +1,46 @@
+should = require('chai').should()
+
+describe 'grunt-node-gyp', ->
+	describe 'configure', ->
+		it 'should configure a release build by default', ->
+			;
+
+		it 'should configure a debug build if the debug option is passed', ->
+			;
+
+		it 'should fail if there is no binding.gyp', ->
+			;
+
+	describe 'build', ->
+		it 'should build a release build by default', ->
+			;
+
+		it 'should build a debug build if the debug option is passed', ->
+			;
+
+		it 'should fail if there are no build files', ->
+			;
+
+	describe 'clean', ->
+		it 'should remove the build directory', ->
+			;
+
+	describe 'rebuild', ->
+		it 'should rebuild a release build by default', ->
+			;
+
+		it 'should rebuild a debug build if the debug option is passed', ->
+			;
+
+		it 'should fail if there is no binding.gyp', ->
+			;
+
+	describe 'default (no command passed)', ->
+		it 'should rebuild a release build by default', ->
+			;
+
+		it 'should rebuild a debug build if the debug option is passed', ->
+			;
+
+		it 'should fail if there is no binding.gyp', ->
+			;


Filter regex is case insensitive.

Filter regex is case insensitive.

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/'


Add examples.coffee, specifically for adding/removing things

error: pathspec 'generators/app/templates/scripts/examples.coffee' did not match any file(s) known to git

--- generators/app/templates/scripts/examples.coffee
+++ generators/app/templates/scripts/examples.coffee
@@ -0,0 +1,19 @@
+# Description:
+#   Event system related utilities
+#
+# Commands:
+#   hubot fake event <event> - Triggers the <event> event for debugging reasons
+#
+# Events:
+#   debug - {user: <user object to send message to>}
+
+util = require 'util'
+
+module.exports = (robot) ->
+
+  robot.respond /FAKE EVENT (.*)/i, (msg) ->
+    msg.send "fake event '#{msg.match[1]}' triggered"
+    robot.emit msg.match[1], {user: msg.message.user}
+
+  robot.on 'debug', (event) ->
+    robot.send event.user, util.inspect event


NO 4 SPACES THIS IS NOT YOUR PYTHON

NO 4 SPACES THIS IS NOT YOUR PYTHON

--- app/assets/javascripts/uploadcare/widget/adapters/instagram-adapter.js.coffee
+++ app/assets/javascripts/uploadcare/widget/adapters/instagram-adapter.js.coffee
@@ -39,12 +39,11 @@
         if not @watcher
           @watcher = new utils.pubsub.PubSub @widget, 'window', @window_id
           jQuery(@watcher).on('done', (e, state) =>
+            @uploader.upload(state.url)

-              @cleanup()
-
-              @uploader.upload(state.url)
+            @cleanup()

-              @widget.dialog.close()
+            @widget.dialog.close()
           )
           @watcher.watch()


improved test counting and status message