Basket was added by making current_item.ready.

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/Bogdan-p/bookingbug-angular.git/'


Provides JS equation buidler with variables when page loads

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

--- javascripts/queries/five_step_variables.coffee
+++ javascripts/queries/five_step_variables.coffee
@@ -0,0 +1,6 @@
+#= require lib
+#= require ./base
+
+ttm.queries.fiveStepVariablesforItemID = (item_id, data_callback)->
+  $.getJSON("/items/" + item_id + "/five_step_variables.json", data_callback)
+    .error(-> alert("error loading data for five step word problem equation builder") );


Add some Unit-Tests for Edit-Controller

Add some Unit-Tests for Edit-Controller

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


Activity: sidebar items appearance on top by a new update is fixed

--- client/Social/Activity/sidebar/activitysidebar.coffee
+++ client/Social/Activity/sidebar/activitysidebar.coffee
@@ -154,7 +154,7 @@
   addItem: (data, prepend = no) ->

     listController = @getListController data.typeConstant
-    index          = if prepend then listController.getItemCount() else 0
+    index          = if prepend then 0

     if item = listController.itemForId data.getId()
       listController.moveItemToIndex item, index


Client: listen for group notification events on client side

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


oops. call the correct functions when poi is selected

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 issue where basic auth isn't working

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/usermindinc/hubot-jira-reporter.git/'


Update oscillator controls

Update oscillator controls

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/ziagrosvenor/sound-machine.git/'


New atom title

New atom title

error: pathspec 'source/atom/title.coffee' did not match any file(s) known to git

--- source/atom/title.coffee
+++ source/atom/title.coffee
@@ -0,0 +1,17 @@
+###
+@TODO
+
+@namespace Atoms.Atom
+@class Label
+
+@author Javier Jimenez Villar <javi@tapquo.com> || @soyjavi
+###
+"use strict"
+
+class Atoms.Atom.Title extends Atoms.Core.Class.Atom
+
+  @template """
+

+      {{#if.image}}{{/if.image}}
+      {{#if.text}}{{text}}{{/if.text}}
+
"""


Don't resend changeID updates.

Don't resend changeID updates.

--- src/spine.ajax.coffee
+++ src/spine.ajax.coffee
@@ -109,12 +109,12 @@
       return if not data or params.data is data
       data = @model.fromJSON(data)

-      # ID change, need to do some shifting
-      if data.id and @record.id isnt data.id
-        @record.changeID(data.id)
+      Ajax.disable =>
+        # ID change, need to do some shifting
+        if data.id and @record.id isnt data.id
+          @record.changeID(data.id)

-      # Update with latest data
-      Ajax.disable =>
+        # Update with latest data
         @record.updateAttributes(data.attributes())

       success?(@record)


TeamMembersCommonView: No need to fetch roles here.


towards a much tidier infobox method preparing for bring hotels maps and ttd maps together


linting issue

linting issue

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/justinlhudson/WebApplication-Client.git/'


Added shared coffeescript

Added shared coffeescript

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

--- app/assets/javascripts/modules/shared/stats.js.coffee
+++ app/assets/javascripts/modules/shared/stats.js.coffee
@@ -0,0 +1,17 @@
+$(document).ready( ->
+  $landStatsCube = $('#land-stats .cube__inner')
+  $marineStatsCube = $('#marine-stats .cube__inner')
+
+  percentageLandCoverage = Math.sqrt($landStatsCube.data('fill-value')*100)
+  $landStatsCube.css('height', "#{percentageLandCoverage}%")
+  $landStatsCube.css('width', "#{percentageLandCoverage}%")
+
+  percentageMarineCoverage = Math.sqrt($marineStatsCube.data('fill-value')*100)
+  $marineStatsCube.css('height', "#{percentageMarineCoverage}%")
+  $marineStatsCube.css('width', "#{percentageMarineCoverage}%")
+
+  $pointsPolygonsBar = $('#points-polygons-ratio .horizontal-bar__inner')
+
+  percentagePolygons = $pointsPolygonsBar.data('fill-value')
+  $pointsPolygonsBar.css('width', "#{percentagePolygons}%")
+)


fix execution of tasks for reving

fix execution of tasks for reving

--- app/templates/gulpfile.coffee
+++ app/templates/gulpfile.coffee
@@ -161,11 +161,11 @@

 #*------------------------------------*\
-#     $MINIFY
-#*------------------------------------*/
-gulp.task "minify", ["sass"], () ->
-  gulp.src(["#{conf.path.dev.css}/style.css"])
-    .pipe minifyCSS({keepSpecialComments: 0})
+#     $REV CSS
+#*------------------------------------*/
+gulp.task "rev:css", ["minify:css"], () ->
+  gulp.src(["#{conf.path.dev.css}/style.min.css"])
+    .pipe rename('style.css')
     .pipe rev()
     .pipe rename({suffix: '.min'})
     .pipe gulp.dest(conf.path.prod.css)
@@ -177,27 +177,16 @@

 #*------------------------------------*\
-#     $REV CSS
-#*------------------------------------*/
-gulp.task "rev:css", ["minify:css"], () ->
-  gulp.src(["#{conf.path.dev.css}/style.min.css"])
-    .pipe rev()
-    .pipe gulp.dest(conf.path.prod.css)
-    .pipe rev.manifest(conf.revManifest.path, conf.revManifest.opts)
-    .pipe gulp.dest('./')
-
-
-
-
-
-#*------------------------------------*\
 #     $REV JS
 #*------------------------------------*/
 gulp.task 'rev:js', ["minify:js"], () ->
   gulp.src(["#{conf.path.dev.js}/built.min.js"])
+    .pipe rename('built.js')
     .pipe rev()
+    .pipe rename({suffix: '.min'})
     .pipe gulp.dest(conf.path.prod.js)
     .pipe rev.manifest(conf.revManifest.path, conf.revManifest.opts)
+    .pipe gulp.dest('./')

@@ -249,14 +238,15 @@
 #     $REV REPLACE
 #     github.com/jamesknelson/gulp-rev-replace/issues/23
 #*------------------------------------*/
-gulp.task 'rev:replace', ["rev:css", "rev:js", "rev:fonts", "rev:images"], () ->
-  manifest = require "./#{conf.path.dev.assets}/rev-manifest.json"
-  stream = gulp.src ["./#{conf.path.prod.css}/#{manifest['style.css']}"]
-
-  Object.keys(manifest).reduce((stream, key) ->
-    stream.pipe replace(key, manifest[key])
-  , stream)
-    .pipe gulp.dest("./#{conf.path.prod.css}")
+gulp.task 'rev:replace', ["rev:css", "rev:js"], () ->
+	manifest = require "./#{conf.path.dev.assets}/rev-manifest.json"
+	stream = gulp.src ["./#{conf.path.prod.css}/#{manifest['style.css']}"]
+
+	Object.keys(manifest).reduce((stream, key) ->
+		# could do with a regex to handle files ending the same
+		stream.pipe replace(key, manifest[key])
+	, stream)
+		.pipe gulp.dest("./#{conf.path.prod.css}")

@@ -366,20 +356,20 @@

 #*-------------------------------------*\
-#      $CLEAN
+#			 $CLEAN
 #*-------------------------------------*/
 gulp.task 'clean:build', (done) ->
-  del "#{conf.path.prod.assets}/**/*", done
+	del ["#{conf.path.prod.assets}/**/*", "#{conf.path.dev.assets}/rev-manifest.json"], done

 #*-------------------------------------*\
-#      $BUILD
+#			 $BUILD
 #*-------------------------------------*/
 gulp.task 'build', () ->
-  runSequence "clean:build", ["rev:replace", "minify:js:vendors"]
+	runSequence "clean:build", "rev:fonts", "rev:images", ["rev:replace", "minify:js:vendors"]


Revert "spec: ffi is crashing on OS X"

Revert "spec: ffi is crashing on OS X"

This reverts commit 706deae1b0dc924fc8cb11f992f36c7cf56530ab.

--- spec/modules-spec.coffee
+++ spec/modules-spec.coffee
@@ -23,7 +23,6 @@
           done()

     describe 'ffi', ->
-      return if process.platform is 'darwin'
       it 'does not crash', ->
         require 'ffi'


Add Directory spec

Add Directory spec

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

--- spec/app/directory-spec.coffee
+++ spec/app/directory-spec.coffee
@@ -0,0 +1,35 @@
+Directory = require 'directory'
+fs = require 'fs'
+
+describe "Directory", ->
+  directory = null
+
+  beforeEach ->
+    directory = new Directory(require.resolve('fixtures'))
+
+  describe "when the contents of the directory change on disk", ->
+    temporaryFilePath = null
+
+    beforeEach ->
+      temporaryFilePath = fs.join(require.resolve('fixtures'), 'temporary')
+      fs.remove(temporaryFilePath) if fs.exists(temporaryFilePath)
+
+    afterEach ->
+      fs.remove(temporaryFilePath) if fs.exists(temporaryFilePath)
+
+    fit "triggers 'contents-change' event handlers", ->
+      changeHandler = null
+
+      runs ->
+        changeHandler = jasmine.createSpy('changeHandler')
+        directory.on 'contents-change', changeHandler
+        fs.write(temporaryFilePath, '')
+
+      waitsFor "first change", -> changeHandler.callCount > 0
+
+      runs ->
+        changeHandler.reset()
+        fs.remove(temporaryFilePath)
+
+      waitsFor "second change", -> changeHandler.callCount > 0
+


add gulpfile

add gulpfile

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

--- gulpfile.coffee
+++ gulpfile.coffee
@@ -0,0 +1,191 @@
+browserify = require 'browserify'
+browserSync = require 'browser-sync'
+buffer = require 'vinyl-buffer'
+coffee = require 'gulp-coffee'
+del = require 'del'
+espower = require 'gulp-espower'
+gulp = require 'gulp'
+gutil = require 'gulp-util'
+less = require 'gulp-less'
+minifyCss = require 'gulp-minify-css'
+mocha = require 'gulp-mocha'
+run = require 'run-sequence'
+source = require 'vinyl-source-stream'
+sourcemaps = require 'gulp-sourcemaps'
+uglify = require 'gulp-uglify'
+watch = require 'gulp-watch'
+watchify = require 'watchify'
+
+dirs =
+  app: './app/'           # html and other resource files
+  dist: './dist/'         # html, bundled javascript and other resource files
+  src: './src/'           # coffee-script files
+  test: './test/'         # coffee-script files for testing
+  tmpSrc: './.tmp/src/'   # compiled javascript files
+  tmpTest: './.tmp/test/' # compiled javascript files for testing
+
+ignoreError = (stream) ->
+  stream.on 'error', (e) ->
+    gutil.log e
+    @emit 'end'
+
+gulp.task 'build', (done) ->
+  run.apply run, [
+    'build:less'
+    'build:html'
+    'build:coffee'
+    'build:js'
+    done
+  ]
+
+gulp.task 'build(dev)', (done) ->
+  run.apply run, [
+    'build:less(dev)'
+    'build:html'
+    'build:coffee(dev)'
+    'build:js(dev)'
+    done
+  ]
+
+gulp.task 'build:coffee', ->
+  gulp.src dirs.src + '**/*.coffee'
+  .pipe coffee()
+  .pipe gulp.dest dirs.tmpSrc
+
+gulp.task 'build:coffee(dev)', ->
+  gulp.src dirs.src + '**/*.coffee'
+  .pipe sourcemaps.init()
+  .pipe ignoreError coffee()
+  .pipe sourcemaps.write()
+  .pipe gulp.dest dirs.tmpSrc
+
+gulp.task 'build:html', ->
+  gulp.src dirs.app + 'index.html'
+  .pipe gulp.dest dirs.dist
+
+gulp.task 'build:js', ->
+  b = browserify
+    entries: [dirs.tmpSrc + 'index.js']
+    debug: false
+  b.bundle()
+  .pipe source 'bundle.js'
+  .pipe buffer()
+  .pipe uglify()
+  .pipe gulp.dest dirs.dist
+
+gulp.task 'build:js(dev)', ->
+  b = browserify
+    entries: [dirs.tmpSrc + 'index.js']
+    debug: true
+  b.bundle()
+  .pipe source 'bundle.js'
+  .pipe buffer()
+  .pipe sourcemaps.init loadMaps: true
+  .pipe sourcemaps.write './'
+  .pipe gulp.dest dirs.dist
+
+gulp.task 'build:less', ->
+  gulp.src dirs.app + 'styles/index.less'
+  .pipe less()
+  .pipe minifyCss()
+  .pipe gulp.dest dirs.dist
+
+gulp.task 'build:less(dev)', ->
+  gulp.src dirs.app + 'styles/index.less'
+  .pipe ignoreError less()
+  .pipe gulp.dest dirs.dist
+
+gulp.task 'build-test', ->
+  gulp.src dirs.test + '**/*.coffee'
+  .pipe sourcemaps.init()
+  .pipe coffee()
+  .pipe espower()
+  .pipe sourcemaps.write()
+  .pipe gulp.dest dirs.tmpTest
+
+gulp.task 'build-test(dev)', ->
+  gulp.src dirs.test + '**/*.coffee'
+  .pipe sourcemaps.init()
+  .pipe ignoreError coffee()
+  .pipe ignoreError espower()
+  .pipe sourcemaps.write()
+  .pipe gulp.dest dirs.tmpTest
+
+gulp.task 'clean', (done) ->
+  del [
+    dirs.tmpSrc
+    dirs.tmpTest
+    dirs.dist
+  ], done
+  null
+
+gulp.task 'default', (done) ->
+  run.apply run, [
+    'clean'
+    'build'
+    done
+  ]
+  null
+
+gulp.task 'test', ['build', 'build-test'], ->
+  gulp.src dirs.tmpTest + '**/*.js'
+  .pipe mocha()
+
+gulp.task 'test(dev)', ['build-test(dev)'], ->
+  gulp.src dirs.tmpTest + '**/*.js'
+  .pipe ignoreError mocha()
+
+gulp.task 'watch', ['build(dev)'], ->
+  watch [
+    dirs.src + '**/*.coffee'
+    dirs.test + '**/*.coffee'
+  ], ->
+    run.apply run, [
+      'build:coffee(dev)'
+      'test(dev)'
+      ->
+    ]
+
+  watch [
+    dirs.app + '**/*.html'
+  ], ->
+    run.apply run, [
+      'build:html'
+      ->
+    ]
+
+  watch [
+    dirs.app + '**/*.less'
+  ], ->
+    run.apply run, [
+      'build:less(dev)'
+      ->
+        browserSync.reload()
+    ]
+
+  browserSync
+    server:
+      baseDir: dirs.dist
+
+  options =
+    cache: {}
+    packageCache: {}
+    entries: [dirs.tmpSrc + 'index.js']
+    debug: true
+  b = browserify options
+  w = watchify b
+
+  bundle = ->
+    w.bundle()
+    .on 'error', gutil.log.bind(gutil)
+    .pipe source 'bundle.js'
+    .pipe buffer()
+    .pipe sourcemaps.init loadMaps: true
+    .pipe sourcemaps.write './'
+    .pipe gulp.dest dirs.dist
+    .on 'end', ->
+      browserSync.reload()
+
+  w.on 'update', bundle
+  w.on 'log', gutil.log.bind(gutil)
+  bundle()


changed describe from gooser to main

changed describe from gooser to main

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


Receiving messages

Receiving messages

--- src/telegram.coffee
+++ src/telegram.coffee
@@ -2,12 +2,16 @@

 class Telegram extends Adapter

-   constructor: (robot) ->
-    @robot = robot
+  constructor: ->
+    super
+    @robot.logger.info "Telegram Adapter"
+
     @token = process.env['TELEGRAM_TOKEN'] || ''
-    @robot.logger.info "Constructor"
-    @api_url = "https://api.telegram.org/bot#{token}/"
-
+    @api_url = "https://api.telegram.org/bot#{@token}"
+
+    @webHook = null
+    @lastMessage = 1
+
   send: (envelope, strings...) ->
     @robot.logger.info "Send"

@@ -21,15 +25,28 @@
   reply: (envelope, strings...) ->
     @robot.logger.info "Reply"

+  receiveMsg: (msg) ->
+    user = @robot.brain.userForId msg.message.from.id, name: msg.message.from.username, room: msg.message.chat.id
+    message = new TextMessage user, msg.message.text, msg.message.message_id
+    @receive message
+    @lastMessage = msg.update_id
+
   run: ->
     self = @
     @robot.logger.info "Run"
     @emit "connected"

-    self.robot.router.post "/telegram/receive", (req, res) ->
-      for msg in req.body.result
-        self.receive new TextMessage msg.message.from, msg.message.text, msg.message.chat.id
-
+    if @webHook
+      self.robot.router.post "/telegram/receive", (req, res) ->
+        for msg in req.body.result
+          self.receiveMsg msg
+    else
+      setTimeout ->
+        self.robot.http("#{self.api_url}/getUpdates?offset=#{self.lastMessage}").get() (err, res, body) ->
+          updates = JSON.parse body
+          for msg in updates.result
+            self.receiveMsg msg
+      , 1000

 exports.use = (robot) ->
   new Telegram robot


Fix send invite loop, add current state method to get how many users waiting for invite

--- workers/social/lib/social/models/invitation.coffee
+++ workers/social/lib/social/models/invitation.coffee
@@ -24,7 +24,9 @@
     indexes         :
       code          : 'unique'
     sharedMethods   :
-      static        : ['create','byCode','sendBetaInviteFromClient','grantInvitesFromClient','markAsSent']
+      static        : ['create','byCode','sendBetaInviteFromClient',
+                       'grantInvitesFromClient','markAsSent',
+                       'betaInviteCount']
     schema          :
       code          : String
       inviteeEmail  : String
@@ -93,7 +95,7 @@
           invitation.update $set:sent:true,(err)->
           callback null,"#{invitation.email} is marked as sent."

-  @sendBetaInviteFromClient = secure (client, options,callback)->
+  @sendBetaInviteFromClient = secure (client, options, callback)->

     unless client.connection.delegate?.can? 'send-invites'
       return callback new KodingError "not authorized"
@@ -101,10 +103,15 @@
       JInvitationRequest = require "./invitationrequest"
       options.sort ?= 1
       if options.batch?
-        JInvitationRequest.some {sent:$ne:true}, {limit:options.batch, sort:requestedAt:options.sort}, (err,emails)->
+        JInvitationRequest.some {sent:$ne:true}, {limit:options.batch, sort:requestedAt:options.sort}, (err, emails)->
+
+          callback null, "Done." if emails.length == 0
+          counter = 0
           daisy queue = emails.map (item)->
             ->
               continueLooping = ->
+                counter += 1
+                callback null, "Done." if emails.length == counter
                 setTimeout (-> queue.next()), 50

               JInvitation.sendBetaInvite email:item.email,(err,res)->
@@ -121,6 +128,18 @@
                     continueLooping()
       else
         JInvitation.sendBetaInvite options,callback
+
+  @betaInviteCount = secure (client, callback)->
+
+    {connection} = client
+    unless connection.delegate?.can? 'send-invites'
+      callback "You are not authorized to do this."
+      console.error "Not authorized request from", connection.delegate?.profile?.nickname
+    else
+      JInvitationRequest = require "./invitationrequest"
+      JInvitationRequest.count {sent:$ne:true}, (err, waitingInvite)->
+        if err then callback err
+        else callback "There are #{waitingInvite} people who is waiting for invite."

   betaTestersHTML = fs.readFileSync nodePath.join(KONFIG.projectRoot, 'email/beta-testers-invite.txt'), 'utf-8'


added mitch.coffee to rollout mitch hedburg quotes when the user types where is mitch

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

--- src/scripts/mitch.coffee
+++ src/scripts/mitch.coffee
@@ -0,0 +1,29 @@
+# Mitch Hedburg
+#
+# where is mitch - This spits out one of the many awesome Mitch Hedburg quotes
+
+quotes = [
+	"A severed foot is the ultimate stocking stuffer.",
+    "I hope the next time I move I get a real easy phone number, something that's real easy to remember. Something like two two two two two two two. I would say \"Sweet.\" And then people would say, \"Mitch, how do I get a hold of you?\" I'd say, \"Just press two for a while and when I answer, you will know you have pressed two enough.",
+    "My friend asked me if I wanted a frozen banana, I said \"No, but I want a regular banana later, so ... yeah\".",
+    "On a traffic light green means 'go' and yellow means 'yield', but on a banana it's just the opposite. Green means 'hold on,' yellow means 'go ahead,' and red means, 'where did you get that banana ?'",
+	"I'm against picketing, but I don't know how to show it.",
+	"I think Bigfoot is blurry, that's the problem. It's not the photographer's fault. Bigfoot is blurry, and that's extra scary to me. There's a large, out-of-focus monster roaming the countryside. Run, he's fuzzy, get out of here.",
+	"One time, this guy handed me a picture of him, he said,\"Here's a picture of me when I was younger.\" Every picture is of you when you were younger. ",
+	"My fake plants died because I did not pretend to water them.",
+	"I walked into Target, but I missed. I think the entrance to Target should have people splattered all around. And, when I finally get in, the guy says, \"Can I help you?\" \"Just practicing.\"",
+	"When I was a boy, I laid in my twin-sized bed and wondered where my brother was.",
+	"Is a hippopotamus a hippopotamus or just a really cool opotamus?",
+	"If I had a dollar for every time I said that, I'd be making money in a very weird way.",
+	"My belt holds up my pants and my pants have belt loops that hold up the belt. What's really goin on down there? Who is the real hero?",
+	"I'm an ice sculptor - last night I made a cube.",
+	"If you have dentures, don't use artificial sweetener, cause you'll get a fake cavity.",
+	"I saw this dude, he was wearing a leather jacket, and at the same time he was eating a hamburger and drinking a glass of milk. I said to him \"Dude, you're a cow. The metamorphosis is complete. Don't fall asleep or I'll tip you over.\"",
+	"A burrito is a sleeping bag for ground beef.",
+	"Here's a thought for sweat shop owners: Air Conditioning. Problem solved.",
+	"I saw a sheet lying on the floor, it must have been a ghost that had passed out... So I kicked it.",
+    "The Kit-Kat candy bar has the name 'Kit-Kat' imprinted into the chocolate. That robs you of chocolate!"]
+
+module.exports = (robot) ->
+	robot.respond /where is mitch\s*(.*)?$/i, (msg) ->
+		msg.send quotes[Math.floor(Math.random() * quotes.length)]


quote - Abort if not HTTP 200

quote - Abort if not HTTP 200

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


Cancel ViewRegistry animation frames between specs

--- src/view-registry.coffee
+++ src/view-registry.coffee
@@ -43,7 +43,7 @@
 # ```
 module.exports =
 class ViewRegistry
-  documentUpdateRequested: false
+  animationFrameRequest: null
   documentReadInProgress: false
   performDocumentPollAfterUpdate: false
   debouncedPerformDocumentPoll: null
@@ -203,16 +203,16 @@
     @documentReaders = []
     @documentWriters = []
     @documentPollers = []
-    @documentUpdateRequested = false
+    if @animationFrameRequest?
+      cancelAnimationFrame(@animationFrameRequest)
+      @animationFrameRequest = null
     @stopPollingDocument()

   requestDocumentUpdate: ->
-    unless @documentUpdateRequested
-      @documentUpdateRequested = true
-      requestAnimationFrame(@performDocumentUpdate)
+    @animationFrameRequest ?= requestAnimationFrame(@performDocumentUpdate)

   performDocumentUpdate: =>
-    @documentUpdateRequested = false
+    @animationFrameRequest = null
     writer() while writer = @documentWriters.shift()

     @documentReadInProgress = true
@@ -238,7 +238,7 @@
     @observer.disconnect()

   requestDocumentPoll: =>
-    if @documentUpdateRequested
+    if @animationFrameRequest?
       @performDocumentPollAfterUpdate = true
     else
       @debouncedPerformDocumentPoll()


Fix a derpage in how we're working with $addToSet in nedb

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


Changed dump URL

Changed dump URL

--- scripts/runAfterGit.coffee
+++ scripts/runAfterGit.coffee
@@ -14,7 +14,7 @@
 ' if '--help' in process.argv

 #TODO: MD5 Verification, using http://54.91.159.37/dump.md5 using digest stream https://github.com/jeffbski/digest-stream
-dbDump = 'http://54.91.159.37/dump.tar.gz' # Don't change this unless you know what you're doing
+dbDump = 'http://analytics.codecombat.com:8080/dump.tar.gz' # Don't change this unless you know what you're doing
 dbLocalPath = '../temp'

 fs = require 'fs'


Fix model class database client ready event subscription

Signed-off-by: Sonmez Kartal <d2d15c3d37396a5f2a09f8b42cf5f27d43a3fbde@koding.com>


add domain-packer

add domain-packer

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

--- src/domain-packer.coffee
+++ src/domain-packer.coffee
@@ -0,0 +1,159 @@
+'use strict'
+fs      = require 'fs'
+Path    = require 'path'
+coffee  = require 'coffee-script'
+require('coffee-script/register')
+
+Path.isAbsolute ?= (str) -> str.charAt(0) is '/'
+
+Facade = require './main'
+{Base} = Facade
+
+MasterDataResource = require './master-data-resource'
+
+class DomainPacker
+
+    pack: (dirname) ->
+        absDirname = @absolutePath(dirname)
+        @validate(absDirname)
+        console.log @getJSCode(absDirname)
+
+
+    validate: (dirname) ->
+        throw new Error("dirname: '#{dirname}' is not found.") if not fs.existsSync(dirname)
+
+
+    getJSCode: (dirname) ->
+        propCodes = []
+        propCodes.push @getMasterProp(dirname)
+        propCodes.push @getCoreProp(dirname)
+        propCodes.push @getModulesProp(dirname)
+        return "module.exports = {\n#{propCodes.join(',\n')}\n}"
+
+
+    getMasterProp: (dirname) ->
+        if masterJSONPath = @getMasterJSONPath(dirname)
+            return "  masterData: require('#{masterJSONPath}')"
+        else
+            return "  masterData: {}"
+
+
+    getCoreProp: (dirname) ->
+
+        coreCodes = for filename in @getClassFiles(dirname)
+            name = filename.split('.')[0]
+            path = @relativePath(dirname) + '/' + name
+            "    '#{name}': require('#{path}')"
+
+        return "  core: {\n#{coreCodes.join(',\n')}\n  }"
+
+
+    getModulesProp: (dirname) ->
+
+        modulesCode = for moduleName in @getModuleNames(dirname)
+            modulePath = Path.join(dirname, moduleName)
+            moduleCodes = for filename in @getClassFiles(modulePath)
+                name = filename.split('.')[0]
+                path = @relativePath(modulePath) + '/' + name
+                "      #{name}': require('#{path}')"
+
+            "    #{moduleName}: {\n#{moduleCodes.join(',\n')}\n    }"
+
+        return "  modules: {\n#{modulesCode.join(',\n')}\n  }"
+
+
+    getModuleNames: (dirname) ->
+
+        path = @absolutePath(dirname)
+
+        fs.readdirSync(path)
+            .filter (subDirName) -> subDirName isnt 'master-data'
+            .filter (subDirName) -> subDirName isnt 'custom-roles'
+            .map (subDirname) -> Path.join dirname, subDirname
+            .filter (subDirPath) -> fs.statSync(subDirPath).isDirectory()
+            .filter (subDirPath) ->
+                fs.readdirSync(subDirPath).some (filename) ->
+                    klass = require Path.join(subDirPath, filename)
+                    (klass::) instanceof Base
+            .map (subDirPath) -> Path.basename(subDirPath)
+
+
+    ###*
+    @method getCodeOfMasterData
+    @private
+    @return {String} path
+    ###
+    getMasterJSONPath: (dirname) ->
+
+        try
+            facade = Facade.createInstance(dirname: @absolutePath(dirname), master: true)
+
+            { masterJSONPath } = facade.master
+
+            return '' if not fs.existsSync(masterJSONPath)
+
+            relPath = MasterDataResource.getJSONPath(@relativePath(dirname))
+            return relPath
+
+        catch e
+            return ''
+
+
+    ###*
+    get domain files to load
+
+    @method getClassFiles
+    @private
+    @return {Array} filenames
+    ###
+    getClassFiles: (dirname) ->
+
+        fileInfoDict = {}
+
+        path = @absolutePath(dirname)
+
+        for filename in fs.readdirSync(path)
+
+            [ name, ext ] = filename.split('.')
+            continue if ext not in ['js', 'coffee']
+
+            klass = require path + '/' + filename
+
+            fileInfoDict[name] = filename: filename, klass: klass
+
+        files = []
+        for name, fileInfo of fileInfoDict
+
+            { klass, filename } = fileInfo
+            continue if filename in files
+
+            ParentClass = Object.getPrototypeOf(klass::).constructor
+
+            if ParentClass.className and pntFileName = fileInfoDict[ParentClass.getName()]?.filename
+
+                files.push pntFileName unless pntFileName in files
+
+            files.push filename
+
+        return files
+
+
+    relativePath: (path) ->
+        # dir = Path.dirname(@file)
+        dir = process.cwd()
+        relPath = Path.relative(dir, path)
+
+        if relPath.charAt(0) isnt '.'
+            relPath = './' + relPath
+
+        return relPath
+
+
+    absolutePath: (path) ->
+        return path if Path.isAbsolute path
+        return process.cwd() + '/' + path
+
+
+module.exports = DomainPacker
+
+new DomainPacker().pack(process.argv[2])


add test

add test

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

--- test/darksky.coffee
+++ test/darksky.coffee
@@ -0,0 +1,16 @@
+chai = require 'chai'
+sinon = require 'sinon'
+chai.use require 'sinon-chai'
+
+expect = chai.expect
+
+describe 'darksky', ->
+  beforeEach ->
+    @robot =
+      respond: sinon.spy()
+      hear: sinon.spy()
+
+    require('../src/darksky')(@robot)
+
+  it 'registers a respond listener for "weather"', ->
+    expect(@robot.respond).to.have.been.calledWith(/weather ?(.+)?/i)


Bongo: Model: describeSchema to provide more information per field

Before it was only providing type of the field, now it produces all the
information including required, description and itemtype for array types


removed debug output

removed debug output

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/niclashoyer/raphael-wires.git/'


Fix to setactive

Fix to setactive

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/nematode/atom-pair.git/'


dot file option

dot file option

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


a cow's gonna be a cow

a cow's gonna be a cow

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

--- scripts/moo.coffee
+++ scripts/moo.coffee
@@ -0,0 +1,10 @@
+# Description:
+#   A cow's gonna be a cow.
+#
+# Commands:
+#   hubot moo* - Reply w/ moo
+
+module.exports = (robot) ->
+  robot.hear /(\s|^)(m|n)o{2,100}(\s|$)/i, (msg) ->
+    msg.send "MOOOOOOOOOOOOOOOOO"
+


Temporarily reduce job frequency.

Temporarily reduce job frequency.

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


Do not null out env

Do not null out env

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/rafalprzywarski/test-status.git/'


rewrite most of check command for better reporting

--- lib/commands/check.coffee
+++ lib/commands/check.coffee
@@ -2,11 +2,15 @@
 fs = require 'fs'
 path = require 'path'
 W = require 'when'
+_ = require 'lodash'

 Rules = require '../rules'

-check = (args, options={}, callback = (->)) ->
+exitCode = 0
+
+check = (args, options={}) ->
   files = args.files
+  console.log "checking #{files.length} files"
   promises = []
   Object.keys(Rules).forEach (ruleName) ->
     Rule = Rules[ruleName]
@@ -14,17 +18,46 @@
       if fs.lstatSync(filePath).isDirectory() then return
       property = new Rule(filePath)
       promises.push(
-        property.check().catch((err) ->
-          throw new Error(
-            "invalid\nfile: #{filePath}:#{err}\nrule: #{property.propertyName}"
-          )
-        ).then( ->
-          console.log "#{filePath} passed #{property.propertyName} rule"
+        property.check().then(
+          (res) ->
+            res: res
+            file: filePath
+            rule: ruleName
+          (err) ->
+            file: filePath
+            rule: ruleName
+            error: err
         )
       )
-  W.all(promises).done( ->
-    console.log 'done'
+  W.all(promises).done((res) ->
+    files = _.uniq _.pluck(res, 'file')
+    for file in files
+      matches = _.where res, {file: file}
+      verbose = true
+      if verbose or _.compact(_.pluck(matches, 'error')).length > 0
+        console.log file
+        for match in matches
+          if match.error?
+            exitCode = 1
+            text = "  failed #{match.rule}"
+            if match.error.lineNumber?
+              text += " on line #{match.error.lineNumber}"
+            if match.error.message?
+              text += ": #{match.error.message}"
+            console.log text
+          else if verbose
+            if match.res is null
+              console.log "  ignored #{match.rule} (no setting defined)"
+            else
+              console.log "  passed #{match.rule}"
+        console.log ''
+    process.exit(exitCode)
   )

+indentText = (text) ->
+  text = text.split('\n')
+  for line, i in text
+    text[i] = "    #{line}"
+  return text.join('\n')

 module.exports = check


Updated to event list to only clear the current event when not in summary mode (i.e. not viewing events on a day by day basis) [BOOK-815]

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/Bogdan-p/bookingbug-angular.git/'


CLIO-24155: extra newline

CLIO-24155: extra newline

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/seanhealy/lib-themisui.git/'


Added resimulateAllSessions route

Added resimulateAllSessions route

--- server/routes/queue.coffee
+++ server/routes/queue.coffee
@@ -13,6 +13,10 @@
   app.get '/queue/messagesInQueueCount', (req, res) ->
     handler = loadQueueHandler 'scoring'
     handler.messagesInQueueCount req, res
+
+  app.post '/queue/scoring/resimulateAllSessions', (req, res) ->
+    handler = loadQueueHandler 'scoring'
+    handler.resimulateAllSessions req, res

   app.all '/queue/*', (req, res) ->


GitLab: Handler: for Project events

GitLab: Handler: for Project events

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


add coffeescript helper (object and string) tests

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

--- test/coffeescriptHelper.coffee
+++ test/coffeescriptHelper.coffee
@@ -0,0 +1,21 @@
+cc = require '../lib/coffeecup'
+
+#describe 'CoffeeScript helper (function)', ->
+  #describe "coffeescript -> alert 'hi'",  ->
+    #it 'should render <script>var __slice = Array.prototype.slice;var __hasProp = Object.prototype.hasOwnProperty;var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };var __extends = function(child, parent) {  for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }  function ctor() { this.constructor = child; }  ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype;  return child; };var __indexOf = Array.prototype.indexOf || function(item) {  for (var i = 0, l = this.length; i < l; i++) {    if (this[i] === item) return i;  } return -1; };(function () {\n  return alert(\'hi\');\n}).call(this);</script>', ->
+      #h = -> coffeescript -> alert 'hi'
+      #cc.render(h).should.equal '<script>var __slice = Array.prototype.slice;var __hasProp = Object.prototype.hasOwnProperty;var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };var __extends = function(child, parent) {  for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }  function ctor() { this.constructor = child; }  ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype;  return child; };var __indexOf = Array.prototype.indexOf || function(item) {  for (var i = 0, l = this.length; i < l; i++) {    if (this[i] === item) return i;  } return -1; };(function () {\n  return alert(\'hi\');\n}).call(this);</script>'
+
+describe 'CoffeeScript helper (string)', ->
+  describe 'coffeescript "alert \'hi\'\"',  ->
+    it 'should render <script type="text/coffeescript">alert \'hi\'</script>', ->
+      h = -> coffeescript "alert 'hi'"
+      cc.render(h).should.equal '<script type="text/coffeescript">alert \'hi\'</script>'
+
+describe 'CoffeeScript helper (object)', ->
+  describe "coffeescript src: 'script.coffee'",  ->
+    it 'should render <script src="script.coffee" type="text/coffeescript"></script>', ->
+      h = -> coffeescript src: 'script.coffee'
+      cc.render(h).should.equal '<script src="script.coffee" type="text/coffeescript"></script>'
+
+


Remove console.log

Remove console.log

--- packages/rocketchat-lib/client/lib/openRoom.coffee
+++ packages/rocketchat-lib/client/lib/openRoom.coffee
@@ -29,7 +29,6 @@
 							return
 				else
 					Meteor.call 'getRoomByTypeAndName', type, name, (err, record) ->
-						console.log 'getRoomByTypeAndName', err, record
 						if err?
 							Session.set 'roomNotFound', {type: type, name: name}
 							BlazeLayout.render 'main', {center: 'roomNotFound'}


first query file

first query file

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

--- queries/most_lines.coffee
+++ queries/most_lines.coffee
@@ -0,0 +1,15 @@
+mysql = require "mysql"
+db = require "../config/db"
+
+connection = mysql.createConnection db
+
+connection.connect()
+
+q = "select count(*) as match_count from tntmatch"
+
+connection.query q, (err, rows, fields) ->
+  console.log "err: ", err if err?
+  console.log "fields: ", fields
+  console.log "rows: ", rows
+
+connection.end()


Client: Activity: Added create channel module actiontypes


Simulator now swaps in empty methods when code doesn't compile.

--- app/lib/simulator/Simulator.coffee
+++ app/lib/simulator/Simulator.coffee
@@ -207,7 +207,12 @@
   transpileSpell: (thang, spellKey, methodName) ->
     slugifiedThangID = _.string.slugify thang.id
     source = @currentUserCodeMap[[slugifiedThangID,methodName].join '/'] ? ""
-    @spells[spellKey].thangs[thang.id].aether.transpile source
+    aether = @spells[spellKey].thangs[thang.id].aether
+    try
+      aether.transpile source
+    catch e
+      console.log "Couldn't transpile #{spellKey}:\n#{source}\n", e
+      aether.transpile ''

   createAether: (methodName, method) ->
     aetherOptions =


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


force images to http [deploy: production]


update zh-HANS.coffee

update zh-HANS.coffee

make the string blank, and comment out the line

--- app/locale/zh-HANS.coffee
+++ app/locale/zh-HANS.coffee
@@ -108,7 +108,7 @@
     email_subscriptions: "邮箱验证"
     email_announcements: "通知"
     email_announcements_description: "接收关于 CodeCombat 最近的新闻和发展的邮件。"
-    contributor_emails: "Contributor Class Emails"
+#    contributor_emails: ""
     contribute_prefix: "我们在寻找志同道合的人！请到 "
     contribute_page: "贡献页面"
     contribute_suffix: " 查看更多信息。"
@@ -131,7 +131,7 @@
     gravatar_not_found_other: "哎呀，没有与这个人的邮箱相关的资料。"
     gravatar_contact: "联系"
     gravatar_websites: "网站"
-    gravatar_accounts: "As Seen On"
+#    gravatar_accounts: ""
     gravatar_profile_link: "完善 Gravatar 资料"

   play_level:


Use different session stores for HTTP and HTTPS; fixes #10.3

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


two cases in fact

two cases in fact

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/0xenvision/negotiator-inator.git/'


CodeEditor: initial commit

CodeEditor: initial commit

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

--- app/src/codeeditor.coffee
+++ app/src/codeeditor.coffee
@@ -0,0 +1,75 @@
+kd         = require 'kd.js'
+CodeMirror = require 'CodeMirror'
+
+# This is required to make CodeMirror plugins and modes to get work ~ GG
+global.CodeMirror = CodeMirror
+
+module.exports = class CodeEditor extends kd.InputView
+
+  constructor: (options = {}, data) ->
+
+    options.type         = 'textarea'
+    options.defaultValue = data?.content
+
+    super options, data
+
+    @once 'viewAppended', =>
+
+      mode = (@getOption 'mode') ? 'javascript'
+      @cm  = CodeMirror.fromTextArea @getElement(),
+        lineNumbers             : yes
+        lineWrapping            : yes
+        styleActiveLine         : yes
+        scrollPastEnd           : yes
+        cursorHeight            : 1
+        tabSize                 : 2
+        mode                    : mode
+        autoCloseBrackets       : yes
+        matchBrackets           : yes
+        showCursorWhenSelecting : yes
+        theme                   : 'tomorrow-night-eighties'
+        extraKeys               :
+
+          'Tab'                 : (cm) ->
+            if cm.somethingSelected()
+            then cm.indentSelection 'add'
+            else cm.execCommand 'insertSoftTab'
+
+          'Shift-Tab'           : (cm) ->
+            cm.indentSelection 'subtract'
+
+          'Cmd-S'               : @bound 'handleSave'
+          'Ctrl-S'              : @bound 'handleSave'
+
+          'Cmd-Enter'           : @bound 'runCode'
+          'Ctrl-Enter'          : @bound 'runCode'
+
+      @loadMode mode
+      @emit 'ready'
+
+  runCode: ->
+    eval @cm.getValue()
+
+  handleSave: ->
+    console.log '> Save called', @cm.getValue()
+
+  focus: -> @cm.focus()
+
+  loadMode: (mode, force = no) ->
+
+    @removeMode mode  if force
+
+    tagName    = 'script'
+    domId      = "lazy-mode-#{mode}"
+    attributes =
+      type     : 'text/javascript'
+      src      : "cm/#{mode}.js"
+    bind       = 'load'
+    load       = => @cm.setOption 'mode', mode
+
+    global.document.head.appendChild (new kd.CustomHTMLView {
+      domId, tagName, attributes, bind, load
+    }).getElement()
+
+  removeMode: (mode) ->
+    (global.document.getElementById "lazy-mode-#{mode}")?.remove()


[deploy: production]

[deploy: production]


using mock factory for SelectedEmployee

using mock factory for SelectedEmployee

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/roseliux/CafeTownsend-Angular-Rails.git/'


finish previous conflict resolution

finish previous conflict resolution

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/clochix/cozy-home.git/'


bug fix

bug fix

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


Loot assignment mockups

Loot assignment mockups

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


Add tests for Message

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


adding a test case for the explicit returns

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

--- test/test_returns.coffee
+++ test/test_returns.coffee
@@ -0,0 +1,12 @@
+first: ->
+  return 'do' for x in [1,2,3]
+
+second: ->
+  return ['re' for x in [1,2,3]]
+
+third: ->
+  return ('mi' for x in [1,2,3])
+
+ok first().join(' ')     is 'do do do'
+ok second()[0].join(' ') is 're re re'
+ok third().join(' ')     is 'mi mi mi'


Add test for Mist Hunter title.

Add test for Mist Hunter title.

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

--- tests/test_wave_8.coffee
+++ tests/test_wave_8.coffee
@@ -0,0 +1,23 @@
+common = require './common'
+
+common.setup()
+
+
+casper.test.begin "Mist Hunter equips Tractor Beam", (test) ->
+    common.waitForStartup('#rebel-builder')
+
+    common.openScumBuilder()
+    common.addShip('#scum-builder', 'G-1A Starfighter', 'Zuckuss')
+    .then ->
+        test.assertDoesntExist "#scum-builder #{common.selectorForUpgradeIndex 1, 7}", "G-1A has no cannon slot by default"
+    common.addUpgrade('#scum-builder', 1, 5, 'Mist Hunter')
+    common.assertUpgradeInSlot(test, '#scum-builder', 1, 7, 'Tractor Beam')
+
+    common.removeUpgrade('#scum-builder', 1, 5)
+    .then ->
+        test.assertDoesntExist "#scum-builder #{common.selectorForUpgradeIndex 1, 7}", "G-1A should no longer have a cannon slot"
+
+    common.removeShip('#scum-builder', 1)
+
+    .run ->
+        test.done()


Replace when 'reload'

Replace when 'reload'

--- resources/assets/coffee/user-dropdown-modal.coffee
+++ resources/assets/coffee/user-dropdown-modal.coffee
@@ -99,7 +99,7 @@
     else if window.reloadUrl
       url = window.reloadUrl
       window.reloadUrl = null
-      Turbolinks.visit url
+      Turbolinks.visit url, action: 'replace'
     else
       osu.reloadPage(null, true)


testrunner: add a dummy index file for bant


Fix misuse of @ in Demand extension

Fix misuse of @ in Demand extension

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


readding openGroup which was removed during a merge


handle vdi remove

handle vdi remove

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

--- src/api/vdi.coffee
+++ src/api/vdi.coffee
@@ -0,0 +1,17 @@
+exports.delete = ->
+  params = @getParams {
+    id: { type: 'string' }
+  }
+
+  # Current user must be an administrator.
+  @checkPermission 'admin'
+
+  try
+    VDI = @getObject params.id
+  catch
+    @throw 'NO_SUCH_OBJECT'
+
+  xapi = @getXAPI VDI
+
+  # TODO: check if VDI is attached before
+  xapi.call "VDI.destroy", VDI.ref


add custom Asana task info listener script

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

--- scripts/asana-info.coffee
+++ scripts/asana-info.coffee
@@ -0,0 +1,62 @@
+# Description:
+#   Listens for Asana URLs and provides info about the task.
+#   The message is a markdown formatted string.
+#   The format looks something like this:
+#
+#   > [ ] Task Title (Assignee)
+#   > Lorem ipsum dolor sit amet, I am the description …
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   HUBOT_ASANA_API_KEY - find this in Account Settings -> API
+#
+# Commands:
+#   Simply post an Asana URL that points to a task, eg.
+#   https://app.asana.com/0/12345678901234/12345678901234
+#
+# Author:
+#   mxlje
+
+api_key = process.env.HUBOT_ASANA_API_KEY
+
+module.exports = (robot) ->
+  robot.hear /app\.asana\.com\/\d{1}\/\d+\/(\d+)/i, (msg) ->
+
+    # extract task ID from URL
+    task_id = msg.match[1]
+    req_uri = "https://app.asana.com/api/1.0/tasks/#{task_id}"
+    auth    = 'Basic ' + new Buffer("#{api_key}:").toString('base64')
+
+    robot.http(req_uri)
+      .header("Authorization", auth)
+      .get() (err, res, body) ->
+
+        # basic error handling
+        if err
+          msg.send "Something went wrong: #{err}"
+          return
+
+        if res.statusCode != 200
+          msg.send "Asana returned HTTP #{res.statusCode}: #{JSON.parse(body).errors[0].message}"
+          return
+
+        # parse the response body
+        data = JSON.parse(body).data
+
+        # prepare some data points based on their existence
+        completed = if data.completed then "[✓]" else "[ ]"
+        assignee  = if data.assignee then "#{data.assignee.name}" else "unassigned"
+
+        response = "> #{completed} **#{data.name}** (#{assignee})"
+
+        # clip notes at first paragraph
+        if data.notes.length > 0
+          split = data.notes.split("\n")
+          notes = if split.length > 1 then "#{split[0]} …" else data.notes
+
+          response = response + "\n> #{notes}"
+
+        # send the finished markdown down the pipe
+        msg.send response


Draft version of the JSON schema builder

error: pathspec 'library/membrane/schema.coffee' did not match any file(s) known to git

--- library/membrane/schema.coffee
+++ library/membrane/schema.coffee
@@ -0,0 +1,137 @@
+###
+Copyright (c) 2013, Alexander Cherniuk <ts33kr@gmail.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+###
+
+_ = require "lodash"
+asciify = require "asciify"
+connect = require "connect"
+logger = require "winston"
+events = require "eventemitter2"
+colors = require "colors"
+assert = require "assert"
+nconf = require "nconf"
+https = require "https"
+http = require "http"
+util = require "util"
+
+# Create a new JSON schema document that adheres to the standard
+# of JSON Schema Draft v4 by running the supplied builder that uses
+# the provides DSL methods to build up the schema. This function
+# returns a ready to use schema represented as an object. Please see
+# http://json-schema.org/latest/json-schema-core.html for reference.
+module.exports.schema = schema = (id, title, pointer) ->
+    context = Object.create {}
+    context = _.extend context, module.exports
+    noId = "no schema identification tag is given"
+    noTitle = "no schema human readable name is given"
+    context.$schema = "http://json-schema.org/draft-04/schema#"
+    rematerialize = (obj) -> JSON.parse JSON.stringify obj
+    assert _.isFunction(pointer), "got no valid schema pointer"
+    assert _.isString(context.title = title), noTitle
+    assert _.isString(context.id = id), noId
+    return rematerialize pointer.apply(context)
+
+# This defines of the the built in pointers. A pointer is a method
+# defintion that provides an ability to specify (or point to) to a
+# specific kind of data type. Pointers may create simple or complex
+# data type references and definitions. Refer to their implementation.
+# A modificator that marks objects as strict (no additional properties).
+module.exports.strict = strict = -> @additionalProperties = no
+
+# This defines of the the built in pointers. A pointer is a method
+# defintion that provides an ability to specify (or point to) to a
+# specific kind of data type. Pointers may create simple or complex
+# data type references and definitions. Refer to their implementation.
+# A modificator that marks arrays as containting only unique items.
+module.exports.unique = unique = (a) -> a.uniqueItems = yes; a
+
+# This defines of the the built in pointers. A pointer is a method
+# defintion that provides an ability to specify (or point to) to a
+# specific kind of data type. Pointers may create simple or complex
+# data type references and definitions. Refer to their implementation.
+# A modificator that marks any array member/pointer as a mandatory.
+module.exports.must = must = (p) -> (k, o) ->
+    assert _.isFunction(p), "incorrect pointer for must"
+    assert _.isString(k), "invalid name of property: #{k}"
+    assert _.isObject(o), "internal error, no outer object"
+    (o.required ?= []).push k; p.apply @, arguments
+
+# This defines of the the built in pointers. A pointer is a method
+# defintion that provides an ability to specify (or point to) to a
+# specific kind of data type. Pointers may create simple or complex
+# data type references and definitions. Refer to their implementation.
+# This pointer creates a reference to object with composite pointer.
+module.exports.object = object = (description, pointer) ->
+    noPointer = "got no pointer to the object members"
+    noCompiled = "content pointer must return object"
+    noDescription = "no description has been given"
+    assert _.isString(description), noDescription
+    assert _.isFunction(pointer), noPointer
+    compiled = pointer.apply this
+    @properties = Object.create this
+    @description = description.toString()
+    assert _.isObject(compiled), noCompiled
+    f = (k, p) => p.call n = Object.create(@), k, @; n
+    @properties[key] = f key, p for key, p of compiled
+    @type = "object"; return this
+
+# This defines of the the built in pointers. A pointer is a method
+# defintion that provides an ability to specify (or point to) to a
+# specific kind of data type. Pointers may create simple or complex
+# data type references and definitions. Refer to their implementation.
+# This pointer creates a reference to an array of other pointers.
+module.exports.array = array = (description, pointer) ->
+    noPointer = "got no pointer to array elements"
+    noDescription = "no description has been given"
+    assert _.isString(description), noDescription
+    assert _.isFunction(pointer), noPointer
+    items = Object.create this; @items = items
+    @description = description.toString()
+    @type = "array"; pointer.apply items; @
+
+# This defines of the the built in pointers. A pointer is a method
+# defintion that provides an ability to specify (or point to) to a
+# specific kind of data type. Pointers may create simple or complex
+# data type references and definitions. Refer to their implementation.
+# This pointer creates a reference to an number with optional props.
+module.exports.number = number = (description, props) ->
+    noProps = "no valid properties object supplied"
+    noDescription = "no description has been given"
+    assert _.isString(description), noDescription
+    props ?= {}; assert _.isObject(props), noProps
+    @description = description.toString()
+    @type = "number"; _.extend this, props; @
+
+# This defines of the the built in pointers. A pointer is a method
+# defintion that provides an ability to specify (or point to) to a
+# specific kind of data type. Pointers may create simple or complex
+# data type references and definitions. Refer to their implementation.
+# This pointer creates a reference to an string with optional props.
+module.exports.string = string = (description, props) ->
+    noProps = "no valid properties object supplied"
+    noDescription = "no description has been given"
+    assert _.isString(description), noDescription
+    props ?= {}; assert _.isObject(props), noProps
+    @description = description.toString()
+    @type = "string"; _.extend this, props; @


Only clear event group if it wasn't manually set

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/Bogdan-p/bookingbug-angular.git/'


Create provider-spec.coffee

Create provider-spec.coffee

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

--- spec/provider-spec.coffee
+++ spec/provider-spec.coffee
@@ -0,0 +1,49 @@
+
+AutocompleteR = require '../lib/main'
+
+# Use the command `window:run-package-specs` (cmd-alt-ctrl-p) to run specs.
+#
+# To run a specific `it` or `describe` block add an `f` to the front (e.g. `fit`
+# or `fdescribe`). Remove the `f` to unfocus the block.
+
+describe "AutocompleteR", ->
+  [editor, provider] = []
+
+  getCompletions = ->
+    cursor = editor.getLastCursor()
+    start = cursor.getBeginningOfCurrentWordBufferPosition()
+    end = cursor.getBufferPosition()
+    prefix = editor.getTextInRange([start, end])
+    request =
+      editor: editor
+      bufferPosition: end
+      scopeDescriptor: cursor.getScopeDescriptor()
+      prefix: prefix
+    provider.getKeywordCompletions(request)
+
+  beforeEach ->
+    waitsForPromise -> atom.packages.activatePackage('autocomplete-R')
+    waitsForPromise -> atom.packages.activatePackage('language-r')
+
+    runs ->
+      provider = atom.packages.getActivePackage('autocomplete-R').mainModule.getProvider()
+
+    waitsFor -> Object.keys(provider.keywords).length > 0
+    waitsForPromise -> atom.workspace.open('test.r')
+    runs -> editor = atom.workspace.getActiveTextEditor()
+
+  it "returns completions on text input", ->
+    editor.setText('')
+    expect(getCompletions().length).toBe 0
+
+  it "returns no completions in comment", ->
+    editor.setText('#')
+
+    editor.setCursorBufferPosition([0, 1])
+    expect(getCompletions().length).toBe 0
+
+  it "returns no completions in string", ->
+    editor.setText('""')
+
+    editor.setCursorBufferPosition([0, 1])
+    expect(getCompletions().length).toBe 0


提取 TextInputer 类

提取 TextInputer 类

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


Remove debuggers

Remove debuggers

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


Add warning on blank post submit (fixes #71)

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/grantovich/CSH-WebNews.git/'


fuck off renly

fuck off renly

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/jencka/2001-A-SPACE-SACRIFICE.git/'


Implement ratioForCharacter

Implement ratioForCharacter

--- src/display-buffer.coffee
+++ src/display-buffer.coffee
@@ -7,6 +7,7 @@
 Token = require './token'
 Decoration = require './decoration'
 LayerDecoration = require './layer-decoration'
+{isDoubleWidthCharacter, isHalfWidthCharacter, isKoreanCharacter} = require './text-utils'

 class BufferToScreenConversionError extends Error
   constructor: (@message, @metadata) ->
@@ -120,7 +121,7 @@
       softWrapColumn: softWrapColumn
       showIndentGuides: @config.get('editor.showIndentGuide', scope: scopeDescriptor)
       tabLength: @config.get('editor.tabLength', scope: scopeDescriptor),
-      ratioForCharacter: -> 1.0 # TODO: replace this with korean/double/half width characters.
+      ratioForCharacter: @ratioForCharacter.bind(this)
     })

   updateAllScreenLines: ->
@@ -214,6 +215,16 @@

   getLineHeightInPixels: -> @lineHeightInPixels
   setLineHeightInPixels: (@lineHeightInPixels) -> @lineHeightInPixels
+
+  ratioForCharacter: (character) ->
+    if isKoreanCharacter(character)
+      @getKoreanCharWidth() / @getDefaultCharWidth()
+    else if isHalfWidthCharacter(character)
+      @getHalfWidthCharWidth() / @getDefaultCharWidth()
+    else if isDoubleWidthCharacter(character)
+      @getDoubleWidthCharWidth() / @getDefaultCharWidth()
+    else
+      1

   getKoreanCharWidth: -> @koreanCharWidth


Need helper to initialize select2 on soon to be added external type fields

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

--- app/assets/javascripts/external_type_select2.coffee
+++ app/assets/javascripts/external_type_select2.coffee
@@ -0,0 +1,6 @@
+expose "initializeExternalTypeSelector", ->
+  $(document).ready ->
+    $("#external-type").select2
+      placeholder: "Select a type"
+      theme: "bootstrap"
+      width: "100%"


Toolbar: handle rename requests from menu, update sidebar and data

--- client/new-stack-editor/lib/views/toolbar.coffee
+++ client/new-stack-editor/lib/views/toolbar.coffee
@@ -1,10 +1,13 @@
 debug = (require 'debug') 'nse:toolbar'

+_
 kd = require 'kd'
 JView = require 'app/jview'

 Events = require '../events'
 Banner = require './banner'
+
+EnvironmentFlux = require 'app/flux/environment'

 module.exports = class Toolbar extends JView
@@ -26,6 +29,16 @@
       disabled     : yes
       attributes   :
         spellcheck : no
+
+      callback     : (value) =>
+        debug 'hit enter on title input', value
+        @emit Events.Action, Events.TemplateTitleChangeRequested, value
+        kd.utils.defer @templateTitle.bound 'makeDisabled'
+
+      keyup        : _.debounce (e) ->
+        EnvironmentFlux.actions
+          .changeTemplateTitle @getData()._id, e.target.value
+      , 100

     @actionButton = new kd.ButtonView
       cssClass : 'action-button solid green compact'
@@ -49,7 +62,13 @@
     @banner.on Events.Banner.Close, =>
       @unsetClass 'has-message'
       kd.utils.wait 500, @banner.bound 'hide'
+
     @forwardEvent @banner, Events.Action
+
+    @on Events.Action, (event) =>
+      if event is Events.Menu.Rename
+        @templateTitle.makeEnabled()
+        @templateTitle.setFocus()

   setTitle: (data) ->


Add new invitations controller

Add new invitations controller

[#98173630]

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


fix (steroids global) Fix usage of isMobile.

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


Update toggleAccepted to work with new ransack params

[#98105252]


showing fixed and with and without accepted [#100734712]


Add gokmen config

Add gokmen 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/andrewjcasal/koding.git/'


page and dnodePage tool

page and dnodePage tool

error: pathspec 'modules/gui/platforms/node/tools/index.coffee' did not match any file(s) known to git

--- modules/gui/platforms/node/tools/index.coffee
+++ modules/gui/platforms/node/tools/index.coffee
@@ -0,0 +1,44 @@
+
+module.exports = tools =
+
+    ##
+    ##
+    ##
+    page: (route, config)->
+
+        new floyd.Config
+            type: 'gui.HttpContext'
+
+            data:
+                route: route
+
+                file: 'index.html'
+
+            remote:
+
+                children: [
+
+                    new floyd.Config
+                        type: 'gui.ViewContext'
+
+                        data:
+                            selector: 'body'
+
+                    , config.content
+
+                ]
+
+        , config
+
+
+    ##
+    ##
+    ##
+    dnodePage: (route, config)->
+
+        tools.page route, new floyd.Config
+
+            remote:
+                type: 'dnode.Bridge'
+
+        , config


remove superflous file

remove superflous file

--- chrome/content/zotero-better-bibtex/aux-scanner.coffee
+++ chrome/content/zotero-better-bibtex/aux-scanner.coffee
@@ -1,29 +0,0 @@
-importFile = (file, createNewCollection) ->
-  if createNewCollection == 'undefined'
-    createNewCollection = true
-  else unless createNewCollection
-    try
-      ZoteroPane.collectionsView.selectLibrary(null) unless ZoteroPane.collectionsView.editable
-
-  translation = new Zotero.Translate.Import()
-
-  if not file
-    translators = translation.getTranslators()
-    nsIFilePicker = Components.interfaces.nsIFilePicker
-    fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker)
-    fp.init(window, Zotero.getString("fileInterface.import"), nsIFilePicker.modeOpen)
-    fp.appendFilters(nsIFilePicker.filterAll)
-    for i of translators
-      fp.appendFilter(translators[i].label, "*." + translators[i].target)
-    rv = fp.show()
-    return false  if rv != nsIFilePicker.returnOK and rv != nsIFilePicker.returnReplace
-    file = fp.file
-  translation.setLocation(file)
-
-  # get translators again, bc now we can check against the file
-  translation.setHandler("translators", (obj, item) ->
-    _importTranslatorsAvailable(obj, item, createNewCollection)
-    return
-  )
-  translators = translation.getTranslators()
-  return


Install app to work with os kite

Install app to work with os kite


teams: /Teams route only works with valid tokens

--- client/landing/site.landing/coffee/teams/routes.coffee
+++ client/landing/site.landing/coffee/teams/routes.coffee
@@ -1,20 +1,40 @@
 do ->
+
+  handleRoute = ({params, query}) ->
+
+    { router } = KD.singletons
+    groupName  = KD.utils.getGroupNameFromLocation()
+
+    # redirect to main.domain/Teams since it doesn't make sense to
+    # advertise teams on a team domain - SY
+    if groupName isnt 'koding'
+      href = location.href
+      href = href.replace "#{groupName}.", ''
+      location.assign href
+      return
+
+    cb = (app) -> app.handleQuery query  if query
+
+    KD.singletons.router.openSection 'Teams', null, null, cb
+
+
+  handleInvitation = (routeInfo) ->
+
+    { params, query } = routeInfo
+    { token }         = params
+
+    return KD.singletons.router.handleRoute '/'  unless token
+
+    KD.utils.routeIfInvitationTokenIsValid token,
+      success   : ({email}) ->
+        KD.utils.storeNewTeamData 'invitation', { teamAccessCode: token, email }
+        handleRoute { params, query }
+      error     : ({responseText}) ->
+        new KDNotificationView title : responseText
+        KD.singletons.router.handleRoute '/'
+

   KD.registerRoutes 'Teams',

-    '/Teams': ({params, query}) ->
-
-      { router } = KD.singletons
-      groupName  = KD.utils.getGroupNameFromLocation()
-
-      # redirect to main.domain/Teams since it doesn't make sense to
-      # advertise teams on a team domain - SY
-      if groupName isnt 'koding'
-        href = location.href
-        href = href.replace "#{groupName}.", ''
-        location.assign href
-        return
-
-      cb = (app) -> app.handleQuery query  if KD.config.hasTeamAccess and query
-
-      KD.singletons.router.openSection 'Teams', null, null, cb
+    '/Teams'       : -> KD.singletons.router.handleRoute '/'
+    '/Teams/:token': handleInvitation


SocialWorker: return error if isApiTokenEnabled is not true

--- workers/social/lib/social/models/apitoken.coffee
+++ workers/social/lib/social/models/apitoken.coffee
@@ -68,6 +68,10 @@
         JGroup.one { slug : group }, (err, group_) ->
           return callback err                                 if err
           return callback new KodingError 'group not found!'  unless group_
+
+          unless !!group_.getAt 'isApiTokenEnabled'
+            return callback new KodingError 'api token usage is not enabled for this group'
+
           queue.next()

       ->


Tests: Helpers: collaborationHelper: Added startSession helper.

error: pathspec 'client/test/lib/helpers/collaborationhelpers.coffee' did not match any file(s) known to git

--- client/test/lib/helpers/collaborationhelpers.coffee
+++ client/test/lib/helpers/collaborationhelpers.coffee
@@ -0,0 +1,29 @@
+helpers = require './helpers.js'
+assert  = require 'assert'
+
+
+module.exports =
+
+  startSession: (browser) ->
+
+    shareButtonSelector = '.status-bar a.share:not(.loading)'
+
+    helpers.beginTest(browser)
+    helpers.waitForVMRunning(browser)
+
+    browser
+      .waitForElementVisible    shareButtonSelector, 20000
+      .element 'css selector', '.status-bar a.share.not-started', (result) =>
+          if result.status is 0
+            console.log 'session is not started'
+            browser
+              .click                  shareButtonSelector
+              .waitForElementVisible  '.chat-view.onboarding', 20000
+              .waitForElementVisible  '.chat-view.onboarding .buttons button.green', 20000
+              .click                  '.chat-view.onboarding .buttons button.green'
+          else
+            console.log 'session is active'
+
+      browser
+        .waitForElementVisible  '.message-pane.privatemessage', 20000 # Assertion
+        .waitForElementVisible  '.status-bar a.share.active', 20000 # Assertion


Temporary fix for youTube iframe player issues

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


app.Zoom, experimental.

app.Zoom, experimental.

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

--- app/client/js/zoom.coffee
+++ app/client/js/zoom.coffee
@@ -0,0 +1,28 @@
+# TODO(steida): Move to este library once stabilized.
+goog.provide 'app.Zoom'
+
+goog.require 'app.device'
+
+class app.Zoom
+
+  ###*
+    TODO(steida): Experimental, don't use it.
+    PATTERN(steida): It would be awesome to be able to control which pages
+    should be zoomable, and which not. Unfortunatelly, in iOS it seems to be
+    impossible to reset scale back to 1 after user leaved scaled page via JS.
+    Also, positioning sucks. But users are used to do two fingers scroll, so we
+    need to provide them alternative way to scale content.
+    @constructor
+  ###
+  constructor: ->
+    @meta = document.querySelector 'meta[name=viewport]'
+
+  ###*
+    @param {boolean} enable
+  ###
+  enable: (enable) ->
+    # TODO(steida): Check Android etc. http://stackoverflow.com/a/21721335
+    @meta.setAttribute 'content', if enable
+      'width=device-width, initial-scale=1.0'
+    else
+      'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no'


Reorganized and styled commands/console-messages (fixed)

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


tabcat.encounter.start() works and is finally readable

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


[fix] [bot] Fixed being able to call 'base.levels' on own channel

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


fixing bug where event was not being cancelled

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/wenchenglai/firehose-ember-shared.git/'


Refactor to reduce cyclomatic complexity.

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


taskDetails => taskId

taskDetails => taskId

--- SingularityUI/app/collections/RequestTasks.coffee
+++ SingularityUI/app/collections/RequestTasks.coffee
@@ -8,7 +8,7 @@

     parse: (tasks) ->
         _.each tasks, (task) ->
-            task.id = task.taskDetails.id
+            task.id = task.taskId.id
             task.name = task.id
             task.updatedAtHuman = if task.updatedAt? then moment(task.updatedAt).from() else ''
             task.createdAtHuman = if task.createdAt? then moment(task.createdAt).from() else ''


added a quick "google me" script

added a quick "google me" script

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

--- src/scripts/google.coffee
+++ src/scripts/google.coffee
@@ -0,0 +1,15 @@
+# Returns the URL of the first google hit for a query
+#
+# google me <query>   - Googles <query> & returns 1st result's URL
+
+module.exports = (robot) ->
+  robot.respond /(google)( me)? (.*)/i, (msg) ->
+    googleMe msg, msg.match[3], (url) ->
+      msg.send url
+
+googleMe = (msg, query, cb) ->
+  msg.http('http://www.google.com/search')
+    .query(q: query)
+    .get() (err, res, body) ->
+      cb body.match(/<a href="([^"]*)" class=l>/)[1]
+


add atom snippets

add atom snippets

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

--- dotfiles/.atom/snippets.cson
+++ dotfiles/.atom/snippets.cson
@@ -0,0 +1,36 @@
+'.source.js, .source.jsx':
+  'React Component':
+    'prefix': 'rnc'
+    'body': """
+import React, { Component } from 'react';
+
+class ${1:Name} extends Component {
+  constructor() {
+    super();
+
+    this.state = {
+      $2
+    };
+  }
+
+  render() {
+    return (
+      $3
+    );
+  }
+}
+
+export default ${1:Name};
+"""
+
+    'Functional React Component':
+        'prefix': 'rnfc'
+        'body': """
+import React from 'react';
+
+const ${1:Name} = () => (
+  $3
+);
+
+export default ${1:Name};
+"""


Implements... a cookie jar

Implements... a cookie jar

error: pathspec 'components/cookies/index.coffee' did not match any file(s) known to git

--- components/cookies/index.coffee
+++ components/cookies/index.coffee
@@ -0,0 +1,18 @@
+_ = require 'underscore'
+{ NODE_ENV } = require('sharify').data
+IS_TEST_ENV = not _.contains(['production', 'staging', 'development'], NODE_ENV)
+methods = ['get', 'set', 'expire']
+
+cookies = ->
+  if IS_TEST_ENV
+    _.reduce methods, (memo, method) ->
+      memo[method] = (->)
+      memo
+    , {}
+  else
+    require 'cookies-js'
+
+module.exports = _.reduce methods, (memo, method) ->
+  memo[method] = -> cookies()[method] arguments...
+  memo
+, {}


conditions added to port request send

conditions added to port request send

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


Added validation tests

Added validation tests

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

--- test/validator_spec.coffee
+++ test/validator_spec.coffee
@@ -0,0 +1,48 @@
+restapi = require '../src/restapi'
+validator = require '../src/validator'
+path = require 'path'
+sinon = require 'sinon'
+assert = require 'assert'
+
+gadgetProjectDir = path.resolve './test/fixtures/iframe-gadget'
+
+describe 'Validation helper', ->
+
+  describe 'given no other versions', ->
+    beforeEach ->
+      sinon.stub restapi, 'getGadgetCatalog', (catalog, options, callback) ->
+        callback null, {}
+    afterEach ->
+      restapi.getGadgetCatalog.restore()
+
+    it 'should pass validation', (done) ->
+      validator.checkProject gadgetProjectDir, {}, done
+
+  describe 'given an equal version', ->
+    beforeEach ->
+      sinon.stub restapi, 'getGadgetCatalog', (catalog, options, callback) ->
+        callback null, {version: '0.1.0', name: 'iframe-gadget'}
+    afterEach ->
+      restapi.getGadgetCatalog.restore()
+
+    it 'should fail validation', (done) ->
+      validator.checkProject gadgetProjectDir, {}, (err) ->
+        assert.ok /already exists/.test err.message
+        done()
+
+  describe 'given a higher version', ->
+    beforeEach ->
+      sinon.stub restapi, 'getGadgetCatalog', (catalog, options, callback) ->
+        callback null, {version: '0.2.0', name: 'iframe-gadget'}
+    afterEach ->
+      restapi.getGadgetCatalog.restore()
+
+    it 'should fail validation', (done) ->
+      validator.checkProject gadgetProjectDir, {}, (err) ->
+        assert.ok /already exists/.test err.message
+        done()
+
+    it 'should suggest the next version', (done) ->
+      validator.checkProject gadgetProjectDir, {}, (err) ->
+        assert.ok /Bump the version.*0\.2\.1/.test err.message
+        done()


Smooth scroll; better documentation for calibration.

--- content_scripts/scroller.coffee
+++ content_scripts/scroller.coffee
@@ -33,7 +33,7 @@
   axisName = scrollProperties[direction].axisName
   before = element[axisName]
   element[axisName] += amount
-  amount == element[axisName] - before
+  element[axisName] == amount + before

 # Test whether element should be scrolled.
 shouldScroll = (element, direction) ->
@@ -88,6 +88,7 @@
     @time = 0
     @lastEvent = null
     @keyIsDown = false
+
     handlerStack.push
       keydown: (event) =>
         @keyIsDown = true
@@ -96,6 +97,14 @@
         @keyIsDown = false
         @time += 1

+    # Calibration fudge factors for continuous scrolling.  The calibration value starts at 1.0.  We then
+    # increase it (until it exceeds @maxCalibration) if we guess that the scroll is too slow, or decrease it
+    # (until it is less than @minCalibration) if we guess that the scroll is too fast.  The cutoff point for
+    # which guess we make is @calibrationBoundary. We require: 0 < @minCalibration <= 1 <= @maxCalibration.
+    @minCalibration = 0.5 # Controls how much we're willing to slow scrolls down; smaller => more slow down.
+    @maxCalibration = 1.6 # Controls how much we're willing to speed scrolls up; bigger => more speed up.
+    @calibrationBoundary = 150 # Boundary between scrolls which are considered too slow, and those too fast.
+
   # Scroll element by a relative amount (a number) in some direction.
   scroll: (element, direction, amount) ->
     return unless amount
@@ -110,9 +119,7 @@
     return if @lastEvent?.repeat

     activationTime = ++@time
-
-    isMyKeyStillDown = =>
-      @time == activationTime and @keyIsDown
+    isMyKeyStillDown = => @time == activationTime and @keyIsDown

     # Store amount's sign and make amount positive; the logic is clearer when amount is positive.
     sign = Math.sign amount
@@ -127,17 +134,12 @@
     previousTimestamp = null
     animatorId = null

-    advanceAnimation = ->
-      animatorId = requestAnimationFrame animate
-
-    cancelAnimation = ->
-      cancelAnimationFrame animatorId
-
-    animate = (timestamp) ->
+    advanceAnimation = -> animatorId = requestAnimationFrame animate
+    cancelAnimation = -> cancelAnimationFrame animatorId
+
+    animate = (timestamp) =>
       previousTimestamp ?= timestamp
-
-      if timestamp == previousTimestamp
-        return advanceAnimation()
+      return advanceAnimation() if timestamp == previousTimestamp

       # The elapsed time is typically about 16ms.
       elapsed = timestamp - previousTimestamp
@@ -145,11 +147,11 @@
       previousTimestamp = timestamp

       # The constants in the duration calculation, above, are chosen to provide reasonable scroll speeds for
-      # scrolls resulting from distinct keypresses.  For continuous scrolls (where the key remains depressed),
-      # some scrolls are too slow, and others too fast.  Here, we compensate a bit.
-      if isMyKeyStillDown() and 50 <= totalElapsed and 0.5 <= calibration <= 1.6
-        calibration *= 1.05 if 1.05 * calibration * amount <= 150 # Speed up slow scrolls.
-        calibration *= 0.95 if 150 <= 0.95 * calibration * amount # Slow down fast scrolls.
+      # distinct keypresses.  For continuous scrolls, some scrolls are too slow, and others too fast. Here, we
+      # speed up the slower scrolls, and slow down the faster scrolls.
+      if isMyKeyStillDown() and 50 <= totalElapsed and @minCalibration <= calibration <= @maxCalibration
+        calibration *= 1.05 if 1.05 * calibration * amount <= @calibrationBoundary # Speed up slow scrolls.
+        calibration *= 0.95 if @calibrationBoundary <= 0.95 * calibration * amount # Slow down fast scrolls.

       # Calculate the initial delta, rounding up to ensure progress.  Then, adjust delta to account for the
       # current scroll state.


actually add custard.coffee file!!

actually add custard.coffee file!!

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

--- shared/code/custard.coffee
+++ shared/code/custard.coffee
@@ -0,0 +1,48 @@
+# Utility functions for the Custard frontend
+
+showOrAddSSH = (model, type) =>
+
+  initZeroClipboard = ->
+    clip = new ZeroClipboard $('.zeroclipboard')[0], { moviePath: "/vendor/js/ZeroClipboard.swf" }
+    clip.on "complete", -> $(@).html ' Copied!'
+    return clip
+
+  makeModal = (html) ->
+    # html should be the HTML *content* of a modal, as a string,
+    # without the surrounding
...

+    if $('.modal').length
+      $('.modal').html html
+      initZeroClipboard()
+    else
+      modalWindow = $("""
#{html}
""")
+      modalWindow.modal()
+      modalWindow.on 'hidden', -> modalWindow.remove()
+      modalWindow.on 'shown', initZeroClipboard
+
+  addSSHKey = ->
+    $('.modal .text-error').remove()
+    key = $('.modal textarea').val()
+    if $.trim(key) == ''
+      $('#ssh-key').after('
Please supply an SSH key!
')
+    else if /PRIVATE KEY/.test key
+      $('#ssh-key').after('
Oops! That looks like your private key. Please paste in the contents of your public key, id_rsa.pub.
')
+    else
+      $.ajax
+        url: "/api/#{window.user.effective.shortName}/sshkeys",
+        type: "POST",
+        data: {key: key}
+      model.set {'type': type}, {silent: true}
+      makeModal JST['modal-ssh'] model.toJSON()
+
+  $.ajax
+    url: "/api/#{window.user.effective.shortName}/sshkeys"
+    success: (sshKeys) ->
+      if sshKeys.length
+        model.set {'type': type}, {silent: true}
+        makeModal JST['modal-ssh'] model.toJSON()
+      else
+        makeModal JST['modal-add-ssh']()
+
+  $(document).on 'click', '.modal #add-ssh-key', addSSHKey
+  $(document).on 'click', '.modal #add-another-ssh-key', ->
+    makeModal JST['modal-add-ssh']()


Added initialisation for suspension datepicker/select2 forms

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

--- app/assets/javascripts/admin/suspension.js.coffee
+++ app/assets/javascripts/admin/suspension.js.coffee
@@ -0,0 +1,7 @@
+$(document).ready ->
+  $('.suspension.select2').select2()
+
+  $(".suspension.datepicker").datepicker(
+    format: "dd/mm/yyyy",
+    autoclose: true
+  )


added features from newer s3 direct upload version, including callback

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