code-examples: Add example for changing site configuration

error: pathspec 'code-examples/coffeescript/configure-site.coffee' did not match any file(s) known to git

--- code-examples/coffeescript/configure-site.coffee
+++ code-examples/coffeescript/configure-site.coffee
@@ -0,0 +1,112 @@
+
+https = require "https"
+
+getConfig = (accessToken, sitePath, callback) ->
+  opts =
+    host: "api.thegrid.io"
+    port: 443
+    path: sitePath
+    method: "GET"
+    headers: {}
+  # Add your `accessToken` to headers
+  opts.headers["Authorization"] = "Bearer #{accessToken}"
+
+  body = ""
+  req = https.request opts
+  req.on "response", (res) ->
+    return callback new Error res.statusCode if res.statusCode != 200
+    res.on 'data', (d) ->
+      body += d.toString()
+    res.on 'end', () ->
+      try
+        config = JSON.parse body
+      catch e
+        return callback e
+      return callback null, config
+  req.end()
+
+setConfig = (accessToken, sitePath, site, callback) ->
+  opts =
+    host: "api.thegrid.io"
+    port: 443
+    path: sitePath
+    method: "PUT"
+    headers: {}
+  # Add your `accessToken` to headers
+  opts.headers["Authorization"] = "Bearer #{accessToken}"
+
+  json = JSON.stringify site
+  opts.headers['Content-Type'] = 'application/json'
+  opts.headers['Content-Length'] = json.length
+  req = https.request opts
+  req.write json
+  req.on "response", (res) ->
+    return callback new Error res.statusCode if res.statusCode != 200
+    return callback null, site
+  #console.log 'set', sitePath, '\n', site
+  req.end()
+
+updateConfig = (token, sitePath, newConfig, callback) ->
+  # To avoid loosing other config values, we fetch existing config first
+  getConfig token, sitePath, (err, site) ->
+    return callback err if err
+    console.log 'newconfig', newConfig
+    for k, v of newConfig
+      site.config[k] = v
+    setConfig token, sitePath, site, callback
+
+lookupSiteId = (accessToken, siteUrl, callback) ->
+  opts =
+    host: "api.thegrid.io"
+    port: 443
+    method: "GET"
+    path: "/site/discover?url=#{encodeURIComponent(siteUrl)}"
+    headers: {}
+  opts.headers["Authorization"] = "Bearer #{accessToken}"
+
+  req = https.request opts
+  req.on 'response', (res) ->
+    return callback new Error res.statusCode if res.statusCode != 302
+    return callback null, res.headers.location
+  req.end()
+
+parseValue = (val) ->
+  return undefined if val == 'undefined'
+  return null if val == 'null'
+  try
+    return JSON.parse val
+  catch e
+    v = parseFloat val
+    return v if not isNaN v
+  return val
+
+main = () ->
+  unless process.argv.length > 2
+    console.log "Usage: coffee configure-site.coffee siteUrl [key] [value]"
+    process.exit 1
+  siteUrl = process.argv[2]
+  key = process.argv[3]
+  value = process.argv[4]
+
+  token = process.env.THEGRID_TOKEN
+  unless token
+    console.log 'Missing authentication token. Must be configured as environment variable THEGRID_TOKEN'
+    process.exit 2
+
+  lookupSiteId token, siteUrl, (err, siteId) ->
+    throw err if err
+
+    if key and value
+      value = parseValue value
+      c = {}
+      c[key] = value
+      updateConfig token, siteId, c, (err, config) ->
+        throw err if err
+        console.log "Set #{key} to #{value}"
+    else
+      getConfig token, siteId, (err, config) ->
+        throw err if err
+        console.log config
+
+main() if not module.parent
+


Change method name for consistency

Change method name for consistency

--- app/assets/javascripts/merge_request_tabs.js.coffee
+++ app/assets/javascripts/merge_request_tabs.js.coffee
@@ -146,7 +146,7 @@
       success: (data) =>
         document.querySelector("div#diffs").innerHTML = data.html
         $('div#diffs .js-syntax-highlight').syntaxHighlight()
-        @expandViewContainer() if @diffViewMode() is 'parallel'
+        @expandViewContainer() if @diffViewType() is 'parallel'
         @diffsLoaded = true
         @scrollToElement("#diffs")

@@ -180,7 +180,7 @@
     $.ajax(options)

   # Returns diff view type
-  diffViewMode: ->
+  diffViewType: ->
     $('.diffs a[id$="-diff-btn"].active').data('view-type')

   expandViewContainer: ->


made method to get history for one patient

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


remove submit grade confirmation 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/'


changing name of loggers

changing name of loggers

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


bug fix

bug fix


update on a sublogger

update on a sublogger


corporations from data module

corporations from data module

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

--- src/javascripts/corporations.coffee
+++ src/javascripts/corporations.coffee
@@ -0,0 +1,7 @@
+data = require '../data.yaml'
+Corporation = require './corporation.coffee'
+
+corporationsData = data.corporations
+corporations = Corporation.extractFromObject corporationsData
+
+module.exports = corporations


add cmy properties to Color

add cmy properties to Color

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


add proper cmy conversions when creating Colors


fix (Test) Remove deprecated requirements for ui.views.current.whenVisible

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


Bettered show logic.

Bettered show logic.


use slower staircasing in Stargazer

use slower staircasing in Stargazer


Some tweaks to #2876.

Some tweaks to #2876.

--- app/views/core/AuthModal.coffee
+++ app/views/core/AuthModal.coffee
@@ -76,18 +76,17 @@
     @enableModalInProgress(@$el) # TODO: part of forms
     loginUser userObject, null, window.nextURL

-  emailCheck = ->
+  emailCheck: ->
     email = $('#email', @$el).val()
-    filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/
+    filter = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i  # https://news.ycombinator.com/item?id=5763990
     unless filter.test(email)
-      forms.setErrorToProperty @$el, 'email', "Please enter a valid email address", true
+      forms.setErrorToProperty @$el, 'email', 'Please enter a valid email address', true
       return false
     return true

   createAccount: ->
-    unless emailCheck() is true
-      return
     forms.clearFormAlerts(@$el)
+    return unless @emailCheck()
     userObject = forms.formToObject @$el
     delete userObject.subscribe
     delete userObject.name if userObject.name is ''


Test course registration component

Test course registration component

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

--- test/course/registration.spec.coffee
+++ test/course/registration.spec.coffee
@@ -0,0 +1,30 @@
+{Testing, expect, sinon, _, ReactTestUtils} = require 'openstax-react-components/test/helpers'
+
+Course = require 'course/model'
+STATUS = require '../../auth/status/GET'
+User = require 'user/model'
+Registration = require 'course/registration'
+NewCourseRegistration = require 'course/new-registration'
+ModifyCourseRegistration = require 'course/modify-registration'
+
+describe 'Registration Component', ->
+
+  beforeEach ->
+    @props =
+      collectionUUID: 'test-collection-uuid'
+
+
+  it 'renders new if course is new', ->
+    Testing.renderComponent( Registration, props: @props ).then ({element}) ->
+      expect(
+        ReactTestUtils.scryRenderedComponentsWithType(element, NewCourseRegistration)
+      ).not.to.be.empty
+
+
+  it 'renders modify if course is already registered', ->
+    course = new Course(STATUS.courses[0])
+    sinon.stub(User, 'getCourse').returns(course)
+    Testing.renderComponent( Registration, props: @props ).then ({element}) ->
+      expect(
+        ReactTestUtils.scryRenderedComponentsWithType(element, ModifyCourseRegistration)
+      ).not.to.be.empty


generate colors for tags

generate colors for tags

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 possible undefined reference.

Fix possible undefined reference.

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


fix #122 getStackClass can be called without position

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/Adirelle/atom-autocomplete-php.git/'


Fixed: alarm's tests

Fixed: alarm's tests

--- test/alarms_tests.coffee
+++ test/alarms_tests.coffee
@@ -4,80 +4,134 @@
 helpers = require './helpers'

 Alarm = require "#{helpers.prefix}server/models/alarm"
+Event = require "#{helpers.prefix}server/models/event"
+NotificationsHelper = require 'cozy-notifications-helper'
+AlarmManager = require "#{helpers.prefix}server/lib/alarm_manager"

 TESTPORT = 8889
 TESTMAIL = 'test@test.com'
 TESTPASS = 'password'

-describe 'Alarm manager handles alarms', ->
+DATE_UTC_FORMAT = 'YYYY-MM-DD[T]HH:mm:ss.000[Z]'
+DATE_ALLDAY_FORMAT = 'YYYY-MM-DD'

-    before helpers.createUser TESTMAIL, TESTPASS
-    before helpers.setup TESTPORT
+describe "Alarm manager handles event's alarms", ->
+
     before ->
-        @client = helpers.getClient TESTPORT, @
-        @dataClient = helpers.getClient 9101, @
+        notifhelper = new NotificationsHelper 'home'
+        @alarmManager = new AlarmManager 'Europe/Paris', Alarm, Event, notifhelper

-    before helpers.wait 2000
     before ->
         @sandbox = sinon.sandbox.create()
         @sandbox.useFakeTimers moment().unix(), 'setTimeout'
-        @spy = @sandbox.spy @app.alarmManager, 'handleNotification'
+        @spy = @sandbox.spy @alarmManager, 'handleNotification'

     after -> @sandbox.restore()

-    after helpers.takeDown
+    it "When I create two events", ->

+        @now = moment().tz 'UTC'
+        @startDate = moment(@now).add 1, 'days'
+        endDate = moment(@startDate).add 1, 'hours'
+        @punctualEvent = new Event
+            _id: 1
+            start: @startDate.format DATE_UTC_FORMAT
+            end: endDate.format DATE_UTC_FORMAT
+            place: ""
+            details: ""
+            description: "Client meeting"
+            rrule: null
+            tags: ["anniversaire"]
+            attendees: []
+            related: null
+            alarms: [
+                { id: 1, trigg: '-PT1H', action: 'DISPLAY' }
+                { id: 2, trigg: '-PT15M', action: 'DISPLAY' }
+            ]
+            created: "2014-11-28T08:02:24.528Z"
+            lastModification: "2014-11-28T09:11:43.476Z"

-    it "When I create 3 Alarms", (done) ->
+        @allDayEvent = new Event
+            _id: 1
+            start: @startDate.format DATE_ALLDAY_FORMAT
+            end: endDate.format DATE_ALLDAY_FORMAT
+            place: ""
+            details: ""
+            description: "Company team building day"
+            rrule: null
+            tags: ["anniversaire"]
+            attendees: []
+            related: null
+            alarms: [
+                { id: 1, trigg: '-PT10M', action: 'DISPLAY' }
+            ]
+            created: "2014-11-28T08:02:24.528Z"
+            lastModification: "2014-11-28T09:11:43.476Z"

-        now = moment().tz 'UTC'
+        @recurringEvent = new Event
+            _id: 1
+            start: @startDate.format DATE_UTC_FORMAT
+            end: endDate.format DATE_UTC_FORMAT
+            place: ""
+            details: ""
+            description: "Friend's birthday"
+            rrule: null
+            tags: ["anniversaire"]
+            attendees: []
+            related: null
+            alarms: [
+                { id: 1, trigg: '-PT5M', action: 'DISPLAY' }
+            ]
+            created: "2014-11-28T08:02:24.528Z"
+            lastModification: "2014-11-28T09:11:43.476Z"

-        date = moment(now).add 5, 's'
-        @alarm1 = new Alarm
-            action: 'DISPLAY'
-            trigg: date.format()
-            description: 'alarm1'
-            timezone: 'Europe/Moscow'
-
-        date = moment(now).subtract 1, 'd'
-        @alarm2 = new Alarm
-            action: 'EMAIL'
-            trigg: date.format()
-            rrule: 'FREQ=DAILY'
-            description: 'alarm2'
-            timezone: 'Europe/Paris'
-
-        date = moment(now).add 10, 's'
-        @alarm3 = new Alarm
-            action: 'BOTH'
-            trigg: date.format()
-            description: 'alarm3'
-            timezone: 'Europe/Paris'
-
-        @alarm1.save (err) =>
-            return done err if err
-            @alarm2.save (err) =>
-                return done err if err
-                @alarm3.save done
+        @alarmManager.addEventCounters @punctualEvent
+        @alarmManager.addEventCounters @allDayEvent
+        @alarmManager.addEventCounters @recurringEvent

     it "handleNotification shouldn't have been called", ->
         @spy.callCount.should.equal 0

-    it "Then I wait for 6s", ->
-        @sandbox.clock.tick 6000
+    it "Then I wait until the end of the day minus 10 minutes", ->
+        dateWanted = moment(@startDate).startOf('day').subtract 10, 'minutes'
+        timeToTick = dateWanted.valueOf() - @now.valueOf()
+        @sandbox.clock.tick timeToTick
+        @timeTicked = timeToTick

-    it "And handleNotification should have been called once with the 1st alarm", ->
+    it "And handleNotification has been called once with all day event's alarm", ->
         @spy.callCount.should.equal 1
         alarm = @spy.firstCall.args[0]
         should.exist alarm
-        alarm.description.should.equal @alarm1.description
+        alarm.description.should.equal @allDayEvent.description

-    it "Then I wait 15 more second", ->
-        @sandbox.clock.tick 15000
+    it "Then I wait for 1 day minus 1 hour", ->
+        # rewinds time to ease calculation
+        @sandbox.clock.tick -@timeTicked

-    it "And handleNotification has been called a second time with the 3rd alarm", ->
+        dateWanted = moment(@startDate).subtract 1, 'hours'
+        timeToTick = dateWanted.valueOf() - @now.valueOf()
+        @sandbox.clock.tick timeToTick
+
+    it "And handleNotification should have been called once with the 1st event's alarm", ->
         @spy.callCount.should.equal 2
         alarm = @spy.secondCall.args[0]
         should.exist alarm
-        alarm.description.should.equal @alarm3.description
+        alarm.description.should.equal @punctualEvent.description

+    it "Then I wait 45 more minutes", ->
+        @sandbox.clock.tick 45 * 60 * 1000
+
+    it "And handleNotification has been called a second time with the 2nd 1st event's alarm", ->
+        @spy.callCount.should.equal 3
+        alarm = @spy.thirdCall.args[0]
+        should.exist alarm
+        alarm.description.should.equal @punctualEvent.description
+
+    it "Then I wait for 10 minutes", ->
+        @sandbox.clock.tick 10 * 60 * 10000
+
+    it "And handleNotification has been called a fourth time with the recurring event's alarm", ->
+        @spy.callCount.should.equal 4
+        alarm = @spy.getCall(3).args[0]
+        should.exist alarm
+        alarm.description.should.equal @recurringEvent.description


add cancelWatcher method to kontrol

add cancelWatcher method to kontrol

--- client/Main/kite/kontrol.coffee
+++ client/Main/kite/kontrol.coffee
@@ -47,14 +47,24 @@
     @_sanitizeQuery query

     onEvent = (options)=>
+      err = options.withArgs[1]
+      return callback err, null  if err
+
       e = options.withArgs[0]
       callback null, {action: e.action, kite: @_createKite e}

-    @kite.tell "getKites", [query, onEvent], (err, kites)=>
+    @kite.tell "getKites", [query, onEvent], (err, result)=>
       return callback err, null  if err

-      for kite in kites
+      # Watcher ID is here but I don't know where to store it. (Cenk)
+      # result.watcherID
+
+      for kite in result.kites
         callback null, {action: @KiteAction.Register, kite: @_createKite kite}
+
+  cancelWatcher: (id, callback)->
+    @kite.tell "cancelWatcher", [id], (err, result)=>
+      return callback err  # result will always be "null"

   # Returns a new NewKite instance from Kite data structure coming from
   # getKites() and watchKites() methods.


GitLab: Event data for reference

GitLab: Event data for reference

error: pathspec 'servers/lib/server/handlers/api/gitlab/_events.coffee' did not match any file(s) known to git

--- servers/lib/server/handlers/api/gitlab/_events.coffee
+++ servers/lib/server/handlers/api/gitlab/_events.coffee
@@ -0,0 +1,141 @@
+# Events from GitLab System Hooks
+# Extracted from http://docs.gitlab.com/ee/system_hooks/system_hooks.html
+
+KNOWN_EVENTS = [
+  'project_create'
+  'project_destroy'
+  'project_rename'
+  'project_transfer'
+  'user_add_to_group'
+  'user_remove_from_group'
+  'user_add_to_team'
+  'user_remove_from_team'
+  'user_create'
+  'user_destroy'
+  'key_create'
+  'key_destroy'
+  'group_create'
+  'group_destroy'
+  'tag_push'
+  'push'
+]
+
+SCOPE = {
+
+  _common: [ 'created_at', 'updated_at' ]
+
+  project: {
+    create: [
+      'name'
+      'owner_email'
+      'path_with_namespace'
+      'project_visibility'
+    ]
+    destroy: [
+      'name'
+      'owner_email'
+      'path_with_namespace'
+      'project_visibility'
+    ]
+    rename: [
+      'name'
+      'owner_email'
+      'path_with_namespace'
+      'old_path_with_namespace'
+      'project_visibility'
+    ]
+    transfer: [
+      'name'
+      'owner_email'
+      'path_with_namespace'
+      'old_path_with_namespace'
+      'project_visibility'
+    ]
+  }
+
+  user: {
+    create: [
+      'username'
+      'email'
+      'name'
+    ]
+    destroy: [
+      'username'
+      'email'
+      'name'
+    ]
+    add_to_team: [
+      'project_path_with_namespace'
+      'user_username'
+      'user_email'
+    ]
+    remove_from_team: [
+      'project_path_with_namespace'
+      'user_username'
+      'user_email'
+    ]
+    add_to_group: [
+      'group_path'
+      'group_access'
+      'user_name'
+      'user_email'
+      'user_username'
+    ]
+    remove_from_group: [
+      'group_path'
+      'group_access'
+      'user_name'
+      'user_email'
+      'user_username'
+    ]
+  }
+
+  key: {
+    create: [
+      'username'
+      'key'
+    ]
+    destroy: [
+      'username'
+      'key'
+    ]
+  }
+
+  group: {
+    create: [
+      'name'
+      'path'
+      'owner_email'
+      'owner_name'
+    ]
+    destroy: [
+      'name'
+      'path'
+      'owner_email'
+      'owner_name'
+    ]
+  }
+
+  tag: {
+    push: [
+      'ref'
+      'user_email'
+      'checkout_sha'
+      'project: { name: project_name }'
+      'project: { path_with_namespace: project_path_with_namespace }'
+      'project: { commits: project_commits }'
+    ]
+  }
+
+  push: {
+    main: [
+      'ref'
+      'user_email'
+      'checkout_sha'
+      'project: { name: project_name }'
+      'project: { path_with_namespace: project_path_with_namespace }'
+      'project: { commits: project_commits }'
+    ]
+  }
+
+}


Make modals not hide when clicking on greyed out background

--- app/assets/javascripts/bootstrap-custom.js.coffee
+++ app/assets/javascripts/bootstrap-custom.js.coffee
@@ -2,3 +2,7 @@
   $(".topbar-wrapper").dropdown()
 $ ->
   $(".alert-message").alert()
+$ ->
+  $(".modal").modal
+    show: false
+    backdrop: "static"


added test for non existing route

added test for non existing route

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


AppController: Set collaborative text only if exists.

--- client/ide/AppController.coffee
+++ client/ide/AppController.coffee
@@ -923,7 +923,7 @@
         else if change.type is 'ContentChange'
           {content, path} = context.file
           string = @rtm.getFromModel path
-          string.setText content
+          string.setText content  if string

         delete context.file?.content?


[fix] [osu] will i ever properly fix this

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


Make getUrl work for devToolsWebContents

--- atom/browser/api/lib/navigation-controller.coffee
+++ atom/browser/api/lib/navigation-controller.coffee
@@ -15,6 +15,11 @@
 class NavigationController
   constructor: (@webContents) ->
     @clearHistory()
+
+    # webContents may have already navigated to a page.
+    if @webContents._getUrl()
+      @currentIndex++
+      @history.push @webContents._getUrl()

     @webContents.on 'navigation-entry-commited', (event, url, inPage, replaceEntry) =>
       if @inPageIndex > -1 and not inPage


fix for deleting multiple tags

fix for deleting multiple tags


Add missing export

Add missing export


Binded mouseenter and mouseleave events to resize tab handles when mouse outed from handle container.

--- client/Framework/components/tabs/KDTabView.coffee
+++ client/Framework/components/tabs/KDTabView.coffee
@@ -29,6 +29,13 @@

     @hideHandleCloseIcons() if options.hideHandleCloseIcons
     @hideHandleContainer()  if options.hideHandleContainer
+
+    @blockTabHandleResize = no
+
+    @tabHandleContainer.on "mouseenter", => @blockTabHandleResize = yes
+
+    @tabHandleContainer.on "mouseleave", => @blockTabHandleResize = no
+

   # ADD/REMOVE PANES
   createPanes:(paneTitlesArray = @getOptions().tabNames)->


Stop storing Requests collections in app

--- SingularityUI/app/application.coffee
+++ SingularityUI/app/application.coffee
@@ -99,11 +99,6 @@

         @state = new State

-        @collections.requestsAll = new Requests state: ''
-        @collections.requestsActive = new Requests state: 'active'
-        @collections.requestsCooldown = new Requests state: 'cooldown'
-        @collections.requestsPaused = new Requests state: 'paused'
-
         resources = [{
             collection_key: 'requestsPending'
             collection: RequestsPending


xdescribed send-message-as tests, because we don't support it yet

error: pathspec 'test/integration/send-message-2-as-spec.coffee' did not match any file(s) known to git

--- test/integration/send-message-2-as-spec.coffee
+++ test/integration/send-message-2-as-spec.coffee
@@ -0,0 +1,102 @@
+_              = require 'lodash'
+mongojs        = require 'mongojs'
+redis          = require 'ioredis'
+async          = require 'async'
+bcrypt         = require 'bcrypt'
+RedisNS        = require '@octoblu/redis-ns'
+
+TestDispatcher = require './test-dispatcher'
+JobManager     = require 'meshblu-core-job-manager'
+HydrantManager = require 'meshblu-core-manager-hydrant'
+
+xdescribe 'SendMessage2: send-as', ->
+  beforeEach (done) ->
+    @db            = mongojs 'meshblu-core-test'
+    @devices       = @db.collection 'devices'
+    @subscriptions = @db.collection 'subscriptions'
+    @uuidAliasResolver =
+      resolve: (uuid, callback) =>
+        callback null, uuid
+
+    @subscriptions.drop =>
+      @devices.drop =>
+        done()
+
+  beforeEach (done) ->
+    @redisUri = process.env.REDIS_URI
+    @dispatcher = new TestDispatcher
+    client = new RedisNS 'meshblu-test', redis.createClient(@redisUri)
+    client.del 'request:queue', done
+
+  beforeEach 'create sender device', (done) ->
+    @auth =
+      uuid: 'imposter-uuid'
+      token: 'leak'
+
+    @senderDevice =
+      uuid: 'sender-uuid'
+      type: 'device:sender'
+      meshblu:
+        version: '2.0.0'
+        whitelists:
+          message:
+            as: 'imposter-uuid': {}
+
+    @devices.insert @senderDevice, done
+
+  beforeEach 'create receiver device', (done) ->
+    @receiverDevice =
+      uuid: 'receiver-uuid'
+      type: 'device:receiver'
+      meshblu:
+        version: '2.0.0'
+        whitelists:
+          message:
+            from: 'sender-uuid': {}
+
+    @devices.insert @receiverDevice, done
+
+  beforeEach 'create imposter device', (done) ->
+    @imposterDevice =
+      uuid: 'imposter-uuid'
+      token: bcrypt.hashSync @auth.token, 8
+      type: 'device:imposter'
+
+    @devices.insert @imposterDevice, done
+
+  context 'When sending a message as another device', ->
+    context "sender-uuid receiving it's sent messages", ->
+      @timeout 5000
+      beforeEach 'create message received subscription', (done) ->
+        subscription =
+          type: 'message.received'
+          emitterUuid: 'received-uuid'
+          subscriberUuid: 'received-uuid'
+
+        @subscriptions.insert subscription, done
+
+      beforeEach (done) ->
+        doneTwice = _.after 2, done
+        job =
+          metadata:
+            auth:
+              uuid: 'imposter-uuid'
+              token: 'leak'
+              as: 'sender-uuid'
+            jobType: 'SendMessage2'
+          data:
+            devices: ['receiver-uuid'], payload: 'boo'
+
+        client = new RedisNS 'messages', redis.createClient(@redisUri)
+        @hydrant = new HydrantManager {client, @uuidAliasResolver}
+        @hydrant.connect uuid: 'receiver-uuid', (error) =>
+          return done(error) if error?
+
+          @hydrant.once 'message', (@message) =>
+            @hydrant.close()
+            doneTwice()
+
+          @dispatcher.generateJobs job, (error, @generatedJobs) => doneTwice()
+
+      it 'should deliver the sent message to the sender', ->
+        expect(@message).to.exist


Fix string representation of error object

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


oauth: add jade, use that rendering popup


make sure suggested values for frame are updated when canvas dims change

--- bokehjs/src/coffee/models/plots/plot_canvas.coffee
+++ bokehjs/src/coffee/models/plots/plot_canvas.coffee
@@ -477,6 +477,8 @@
     height = @model._height._value

     @canvas_view.set_dims([width, height], true)
+
+    @update_constraints()

     # This allows the plot canvas to be positioned around the toolbar
     @$el.css({


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


increasing a timeout

increasing a timeout


Remove old startServer and don't return item 'active' on getServers

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/Morgy93/Rocket.Chat.Cordova.git/'


fix smoke tests after changing updependency injection arguments


Forgot the setup script.

Forgot the setup script.

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

--- browser/node_setup.coffee
+++ browser/node_setup.coffee
@@ -0,0 +1,13 @@
+"use strict"
+
+# Doppio's custom 'require' function, which BFS monkey-patches.
+window.require = (path, herp) ->
+  # XXX: Hackfix for Ace Editor. The Ace Editor clobbers our require definiton,
+  # but recalls it with an empty first argument.
+  if herp? then path = herp
+  [name, ext] = BrowserFS.node.path.basename(path).split '.'
+  window[name] ?= {}
+
+BrowserFS.install(window)
+BrowserFS.initialize(new BrowserFS.FileSystem.InMemory())
+window.node = BrowserFS.node


Adding latest google map tiles.

Adding latest google map tiles.

--- src/main/webapp/lib/views/AppView.coffee
+++ src/main/webapp/lib/views/AppView.coffee
@@ -72,6 +72,8 @@
         style: google.maps.ZoomControlStyle.DEFAULT,
         position: google.maps.ControlPosition.TOP_LEFT
     }
+    # Enable the visual refresh (new maps)
+    google.maps.visualRefresh = true
     #attach the map to the namespace
     $a.map = new google.maps.Map $("#map_canvas")[0], mapOpts


Fixing indentation on encounter.coffee that stops compilation.

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


Kite: check user has permission before deleting kite


SocialWorker: JName: replace dash with async.parallel


[Artist] fixes tests

[Artist] fixes tests

--- src/desktop/apps/artist/test/templates.coffee
+++ src/desktop/apps/artist/test/templates.coffee
@@ -31,6 +31,9 @@
         artist: @artist
         nav: @nav
         viewHelpers: helpers
+        showSections:
+          header: true
+          info: true
       }, done

     it 'should not display the no works message if there is more than 0 artworks', ->
@@ -62,6 +65,9 @@
         artist: @artist
         nav: @nav
         viewHelpers: helpers
+        showSections:
+          header: true
+          info: true
       }, done

     it 'should not display the no works message if there is more than 0 artworks', ->
@@ -96,6 +102,9 @@
         artist: @artist
         nav: @nav
         viewHelpers: helpers
+        showSections:
+          header: true
+          info: true
       }, done

     it 'should display the no works message if there are no artworks', ->


total predictions by AT to limit by caps

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


temporary hack to sort our three tasks by increasing difficulty rather than alphabetically


Optional ssh verbosity

Optional ssh verbosity

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


Rename @pack to @metadata

Rename @pack to @metadata

--- src/packages/config-view/lib/package-view.coffee
+++ src/packages/config-view/lib/package-view.coffee
@@ -29,33 +29,41 @@
           @a 'Show README', outlet: 'readmeLink'
           @div class: 'readme', outlet: 'readme'

+  pack: null
+  metadata: null
   installed: false
   disabled: false
   bundled: false
   updateAvailable: false

-  initialize: (@pack, @packageEventEmitter) ->
+  initialize: (pack, @packageEventEmitter) ->
+    if pack instanceof Package
+      @pack = pack
+      @metadata = @pack.metadata
+    else
+      @metadata = pack
+
     @updatePackageState()

-    @attr('name', @pack.name)
-    @name.text(@pack.name)
-    if version = semver.valid(@pack.version)
+    @attr('name', @metadata.name)
+    @name.text(@metadata.name)
+    if version = semver.valid(@metadata.version)
       @version.text(version)
     else
       @version.hide()

-    if @pack.descriptionHtml
-      @description.html(@pack.descriptionHtml)
-    else if @pack.description
-      @description.text(@pack.description)
+    if @metadata.descriptionHtml
+      @description.html(@metadata.descriptionHtml)
+    else if @metadata.description
+      @description.text(@metadata.description)
     else
       @description.text('No further description available.')

     @readme.hide()
-    if @pack.readmeHtml
-      @readme.html(pack.readmeHtml)
-    else if @pack.readme
-      @readme.text(@pack.readme)
+    if @metadata.readmeHtml
+      @readme.html(@metadata.readmeHtml)
+    else if @metadata.readme
+      @readme.text(@metadata.readme)
     else
       @readmeArea.hide()

@@ -67,12 +75,12 @@
         @readme.show()
         @readmeLink.text('Hide README')

-    homepage = @pack.homepage
+    homepage = @metadata.homepage
     unless homepage
-      if _.isString(@pack.repository)
-        repoUrl = @pack.repository
+      if _.isString(@metadata.repository)
+        repoUrl = @metadata.repository
       else
-        repoUrl = @pack.repository?.url
+        repoUrl = @metadata.repository?.url
       if repoUrl
         repoUrl = repoUrl.replace(/.git$/, '')
         homepage = repoUrl if require('url').parse(repoUrl).host is 'github.com'
@@ -81,7 +89,7 @@
     else
       @homepage.hide()

-    if issues = @pack.bugs?.url
+    if issues = @metadata.bugs?.url
       @issues.find('a').attr('href', issues)
     else
       @issues.hide()
@@ -96,16 +104,16 @@
       if @installed
         if @updateAvailable
           @defaultAction.text('Upgrading\u2026')
-          packageManager.install @pack, (error) =>
-            @packageEventEmitter.trigger('package-upgraded', error, @pack)
+          packageManager.install @metadata, (error) =>
+            @packageEventEmitter.trigger('package-upgraded', error, @metadata)
         else
           @defaultAction.text('Uninstalling\u2026')
-          packageManager.uninstall @pack, (error) =>
-            @packageEventEmitter.trigger('package-uninstalled', error, @pack)
+          packageManager.uninstall @metadata, (error) =>
+            @packageEventEmitter.trigger('package-uninstalled', error, @metadata)
       else
         @defaultAction.text('Installing\u2026')
-        packageManager.install @pack, (error) =>
-          @packageEventEmitter.trigger('package-installed', error, @pack)
+        packageManager.install @metadata, (error) =>
+          @packageEventEmitter.trigger('package-installed', error, @metadata)

     @updateDefaultAction()

@@ -116,24 +124,24 @@
       @updateDefaultAction()
       @updateEnabledState()

-    @packageEventEmitter.on 'package-installed package-uninstalled package-upgraded', (error, pack) =>
-      if pack?.name is @pack.name
+    @packageEventEmitter.on 'package-installed package-uninstalled package-upgraded', (error, metadata) =>
+      if metadata?.name is @metadata.name
         @defaultAction.enable()
         @updatePackageState()
         @updateDefaultAction()

   togglePackageEnablement: ->
     if @disabled
-      config.removeAtKeyPath('core.disabledPackages', @pack.name)
+      config.removeAtKeyPath('core.disabledPackages', @metadata.name)
     else
-      config.pushAtKeyPath('core.disabledPackages', @pack.name)
+      config.pushAtKeyPath('core.disabledPackages', @metadata.name)

   updatePackageState: ->
-    @disabled = atom.isPackageDisabled(@pack.name)
+    @disabled = atom.isPackageDisabled(@metadata.name)
     @updateAvailable = false
     @bundled = false
-    loadedPackage = atom.getLoadedPackage(@pack.name)
-    packagePath = loadedPackage?.path ? atom.resolvePackagePath(@pack.name)
+    loadedPackage = atom.getLoadedPackage(@metadata.name)
+    packagePath = loadedPackage?.path ? atom.resolvePackagePath(@metadata.name)
     @installed = packagePath?
     if @installed
       for packageDirPath in config.bundledPackageDirPaths
@@ -144,8 +152,8 @@
       version = loadedPackage?.metadata.version
       unless version
         try
-          version = Package.loadMetadata(@pack.name).version
-      @updateAvailable = semver.gt(@pack.version, version)
+          version = Package.loadMetadata(@metadata.name).version
+      @updateAvailable = semver.gt(@metadata.version, version)

     if @updateAvailable
       @update.show()


Add atom's keymap.cson for custom key mappings

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

--- keymap.cson
+++ keymap.cson
@@ -0,0 +1,5 @@
+'atom-workspace, atom-workspace atom-text-editor':
+    'cmd-shift-M': 'markdown-preview:toggle'
+'body':
+    'cmd-shift-s': 'window:save-all'
+    'cmd-shift-w': 'tabs:close-all-tabs'


Referral: change variable name

Referral: change variable name


[repl] BY THE POWER OF HACKS, I have printed result!

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


ignore error on exit

ignore error on exit

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/chrism-dp/task-runner.git/'


fixed comma's on ES6 class snippets

fixed comma's on ES6 class snippets

/bin/sh: 1: Syntax error: "(" unexpected


Initial commit💯

Initial commit💯

boot.coffee, CoffeeScript i.e., transcompiles to JavaScript -> boot.js
Help: http://coffeescript.org/.

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

--- source/core/coffee/boot.coffee
+++ source/core/coffee/boot.coffee
@@ -0,0 +1,18 @@
+#
+# IICS®
+# Indian Institute of Crime Science.
+# _______________________________________________________________
+# CoffeeScript, http://coffeescript.org/.
+# The Non-AMD JavaScript - for defining "ITDB®" configurations.
+# _______________________________________________________________
+# Architecture and Code Handcrafted by Prabhat Kumar.
+# Architectuur en Code handgemaakt door Prabhat Kumar.
+# @author    : Prabhat Kumar [http://prabhatkumar.org/]
+# @copyright : Sequømics Corporation [http://sequomics.com/]
+# _______________________________________________________________
+# @date      : 02-Sept-2016
+# @license   : Apache, version 2.0
+# @require   : Node.js®
+# @require   : NPM
+# @require   : Grunt
+# _______________________________________________________________


remove debug print

remove debug print

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


Import objname tests

Import objname tests

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


Add missing Cookie import (#4056)

Add missing Cookie import (#4056)

Add missing Cookie import

--- src/desktop/components/main_layout/client.coffee
+++ src/desktop/components/main_layout/client.coffee
@@ -4,6 +4,7 @@
 MarketingSignupModal = require '../marketing_signup_modal/index.coffee'
 CurrentUser = require '../../models/current_user.coffee'
 FlashMessage = require '../flash/index.coffee'
+Cookies = require 'cookies-js'

 module.exports = ->
   globalClientSetup()


[preprocessor] add silent option

[preprocessor] add silent option


draggables!

draggables!

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

--- source/javascripts/draggable.coffee
+++ source/javascripts/draggable.coffee
@@ -0,0 +1,234 @@
+###
+Simplistic global draggable implementation derived from
+    (http://tpstatic.com/_sotc/sites/default/files/61/source/javascript.js)
+    (http://tech.pro/tutorial/650/javascript-draggable-elements)
+
+Depends on jQuery, and assumes that all elements will be jQuery elements
+Relies on all elements being jQuery objects
+###
+
+class Position
+
+    ordinals = ['x', 'y']
+
+    @FromElement = (el) ->
+        offset = el.offset()
+        new Position(offset.left, offset.top)
+
+    constructor: (x, y) ->
+        @x = x
+        @y = y
+
+    clone: ->
+        new Position(@x, @y)
+
+    add: (p) ->
+        res = @clone()
+        if not p?
+            return
+
+        for o in ordinals
+            if !isNaN(p[o])
+                res[o] += p[o]
+
+        return res
+
+    sub: (p) ->
+        res = @clone()
+        if not p?
+            return res
+
+        for o in ordinals
+            if !isNaN(p[o])
+                res[o] -= p[o]
+
+        return res
+
+    min: (p) ->
+        res = @clone()
+        if not p?
+            return res
+
+        for o in ordinals
+            if !isNaN(p[o]) and this[o] > p[o]
+                res[o] = p[o]
+
+        return res
+
+    max: (p) ->
+        res = @clone()
+        if not p?
+            return res
+
+        for o in ordinals
+            if !isNaN(p[o]) and this[o] < p[o]
+                res[o] = p[o]
+
+        return res
+
+    bound: (lower, upper) ->
+        @max(lower).min(upper)
+
+    # return a validified copy of this
+    check: ->
+        res = @clone()
+        for o in ordinals
+            if isNaN res[o]
+                res[o] = 0
+        res
+
+class Draggable
+    event_namespace = 'mousetileDraggable'
+    defaultRoot = window.document
+
+    defaultMoveCb = (global, start, el) ->
+        el.css
+        top:  "#{global.y}px"
+        left: "#{global.x}px"
+
+
+    cancelEvent = (evt) ->
+        evt.stopPropagation()
+        evt.preventDefault()
+        return false
+
+    findPosition = (evt) ->
+        new Position(evt.pageX, evt.pageY)
+
+    # bind a function as `this`
+    bind = (fn, obj) ->
+        return ->
+            fn.apply(obj, arguments)
+
+
+
+                       # these are kwargs
+    constructor: (el, {lowerBound, upperBound, startCb, moveCb, endCb, handle, root, attachLater}) ->
+        @element = el                  # element to move
+        @handle = handle || el         # click target
+
+        @root = root || defaultRoot    # mouse move listener
+
+        if lowerBound and upperBound
+            @updateBounds(lowerBound, upperBound)
+
+        # event callback
+        @startCb = startCb
+        @moveCb  = moveCb || defaultMoveCb
+        @endCb   = endCb
+
+        @cursorStartPos = null
+        @elementStartPos = null
+
+        @dragging = false
+        @listening = false
+        @disposed = false
+
+        if not attachLater
+            @startListening()
+
+
+    # bind a method as an event handler on an element
+    hook: (el, event_name, cb) ->
+        bound = bind(cb, this)
+        jQuery(el).on("#{event_name}.#{event_namespace}", null, null, bound)
+
+    unhook: (el, event_name) ->
+        jQuery(el).off("#{event_name}.#{event_namespace}")
+
+    updateBounds: (lowerBound, upperBound) ->
+        @lowerBound = lowerBound.min(upperBound)
+        @upperBound = lowerBound.max(upperBound)
+        console.log("bounds updated on draggable to", @lowerBound.x, @lowerBound.y, @upperBound.x, @upperBound.y)
+
+    dragStart: (evt) ->
+
+        # is this the right event?
+        if evt.which != 1
+            return
+
+        console.log(evt)
+
+        return if @dragging or not @listening or @disposed
+        console.log "dragStart"
+
+        @dragging = true
+
+        if @startCb
+            @startCb(evt, @element)
+
+        @cursorStartPos = new Position(evt.pageX, evt.pageY)
+        pos = @element.offset()
+        @elementStartPos = (new Position(pos.left, pos.top)).check()
+
+        console.log('start position', @elementStartPos)
+
+        # bind listeners to the root object, which is currently the
+        # document.
+        @hook(@root, "mousemove", @dragGo)
+        @hook(@root, "mouseup", @dragStopHook)
+
+        cancelEvent(evt)
+
+    dragGo: (evt) ->
+        return if not @dragging or @disposed
+
+        pos = findPosition(evt)
+        # adjust for cursor offset withing element
+        pos = pos.add(@elementStartPos).sub(@cursorStartPos)
+        # constrain to boundry points
+        pos = pos.bound(@lowerBound, @upperBound)
+
+        # Move callback should set the position change!!!!
+        if @moveCb
+            # abs_pos, abs_start_pos, element
+            @moveCb(pos, @elementStartPos, @element)
+
+        cancelEvent(evt)
+
+    dragStop: ->
+        return if not @dragging or @disposed
+
+        @unhook(@root, "mousemove")
+        @unhook(@root, "mouseup")
+
+        @cursorStartPos = null
+        @elementStartPos = null
+
+        if @endCb
+            @endCb(@element)
+
+        @dragging = false
+
+    dragStopHook: (evt) ->
+        @dragStop()
+        cancelEvent(evt)
+
+    dispose: ->
+        return if @disposed
+        @stopListening(true)
+        # possibly unneeded: we're an object now, instead of a closure
+        @element = @handle = @lowerBound = @upperBound = @startCb = @endCb = @moveCb = null
+        @disposed = true
+
+    startListening: ->
+        return if @listening or @disposed
+        @listening = true
+        @hook(@handle, "mousedown", @dragStart)
+
+    stopListening: (stopCurrentDrag = false) ->
+        return if not @listening or @disposed
+
+        @unhook(@handle, "mousedown")
+        @listening = false
+
+        if stopCurrentDrag and @dragging
+            @dragStop()
+
+exports = {
+    'Draggable': Draggable
+    'Position':  Position
+    'Point':     Position
+}
+
+window.Draggable = exports


text change

text change

--- src/steroids/Deploy.coffee
+++ src/steroids/Deploy.coffee
@@ -28,7 +28,7 @@
       util.log "ERROR: Canceling cloud build due to login failure"
       process.exit 1

-    util.log "Refreshing application"
+    util.log "Building application locally"
     pushOutput = execSync "steroids push", true

     if pushOutput.stderr != ""


Hide the play options if zoom is active. (#2277)

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


remove unnecessary id creation

remove unnecessary id creation

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


Improved use of promises.

Improved use of promises.

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/urbanetic/meteor-atlas-util.git/'


stacks: removed file added back

stacks: removed file added back

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


Fixing AJAX race condition in TripTicketsMap javascript class. #1868

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


add plumber option to ignore error

add plumber option to ignore 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/jmartsch/generator-fixate-pw.git/'


making it easier to get the id of the Service

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


Avoid empty query terms. With the previous version, a query like "hello   there" yielded:   [ "hello", "", "", "there" ] as the queryTerms.

--- background_scripts/main.coffee
+++ background_scripts/main.coffee
@@ -192,8 +192,9 @@

 refreshCompleter = (request) -> completers[request.name].refresh()

+whitespaceRegexp = /\s+/
 filterCompleter = (args, port) ->
-  queryTerms = if (args.query == "") then [] else args.query.split(" ")
+  queryTerms = if (args.query == "") then [] else args.query.split(whitespaceRegexp)
   completers[args.name].filter(queryTerms, (results) -> port.postMessage({ id: args.id, results: results }))

 getCurrentTimeInSeconds = -> Math.floor((new Date()).getTime() / 1000)


Tidy up #1507.

Tidy up #1507.

--- background_scripts/main.coffee
+++ background_scripts/main.coffee
@@ -164,9 +164,13 @@
 # Opens request.url in new tab and switches to it if request.selected is true.
 #
 openUrlInNewTab = (request, callback) ->
-  chrome.tabs.getSelected(null, (tab) ->
-    chrome.tabs.create({ url: Utils.convertToUrl(request.url), index: tab.index + 1, selected: true, windowId: tab.windowId },
-                         (tab) -> callback()))
+  chrome.tabs.getSelected null, (tab) ->
+    tabConfig =
+      url: Utils.convertToUrl request.url
+      index: tab.index + 1
+      selected: true
+      windowId: tab.windowId
+    chrome.tabs.create tabConfig, callback

 openUrlInIncognito = (request) ->
   chrome.windows.create({ url: Utils.convertToUrl(request.url), incognito: true})
@@ -232,7 +236,7 @@
 # These are commands which are bound to keystroke which must be handled by the background page. They are
 # mapped in commands.coffee.
 BackgroundCommands =
-  createTab: (callback) -> openUrlInNewTab({ url: Settings.get("newTabUrl") }, (tab) -> callback())
+  createTab: (callback) -> openUrlInNewTab { url: Settings.get("newTabUrl") }, callback
   duplicateTab: (callback) ->
     chrome.tabs.getSelected(null, (tab) ->
       chrome.tabs.duplicate(tab.id)


Fix "move tab to new window" for incognito tabs

--- background_scripts/main.coffee
+++ background_scripts/main.coffee
@@ -236,8 +236,9 @@
       chrome.tabs.duplicate(tab.id)
       selectionChangedHandlers.push(callback))
   moveTabToNewWindow: (callback) ->
-    chrome.tabs.getSelected(null, (tab) ->
-      chrome.windows.create({tabId: tab.id}))
+    chrome.tabs.query {active: true, currentWindow: true}, (tabs) ->
+      tab = tabs[0]
+      chrome.windows.create {tabId: tab.id, incognito: tab.incognito}
   nextTab: (callback) -> selectTab(callback, "next")
   previousTab: (callback) -> selectTab(callback, "previous")
   firstTab: (callback) -> selectTab(callback, "first")


Added a basic speed test

Added a basic speed test

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

--- test/speed_test.coffee
+++ test/speed_test.coffee
@@ -0,0 +1,27 @@
+redeye_suite = require './support/redeye_suite'
+
+start_time = null
+
+module.exports = redeye_suite
+
+  # Tests that a pathological 1000-step case is still fast
+  'test result and audit log':
+
+    workers:
+      # 'n' just counts down
+      n: (i) ->
+        i = parseInt i
+        if i == 1 then 1 else @get_now('n', i-1) + 1
+
+    # Request a 1000-step job. Record when the request is made.
+    setup: ->
+      start_time = new Date().getTime()
+      @request 'n', 1000
+
+    # Assert that the job didn't take a really long time.
+    expect: ->
+      dt = new Date().getTime() - start_time
+      @db.get 'n:1000', (err, str) =>
+        @assert.equal str, 1000
+        @assert.equal true,  (dt < 3000)
+        @finish()


Use case insensitive comparisons for code comparisons

--- app/assets/javascripts/core.js.coffee
+++ app/assets/javascripts/core.js.coffee
@@ -52,6 +52,9 @@
   @returns {String} the code system name
   ###
   codeSystemName: -> @csn
+
+  @normalize: (val) ->
+    String(val).toLowerCase()

   ###*
   Returns true if the contained code and codeSystemName match a code in the supplied codeSet.
@@ -62,7 +65,9 @@
     for codeSystemName, codes of codeSet
       if @csn==codeSystemName
         for code in codes
-          if code==@c
+          c1 = hQuery.CodedValue.normalize(code)
+          c2 = hQuery.CodedValue.normalize(@c)
+          if c1==c2
             return true
     return false


Fix pie chart subcategory depth

Fix pie chart subcategory depth

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/12eh/YABA.git/'


chore: minor styling

chore: minor styling

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


start thinking about a repl

start thinking about a repl

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

--- lib/gui/repl.coffee
+++ lib/gui/repl.coffee
@@ -0,0 +1,28 @@
+
+blessed = require 'blessed'
+_       = require 'lodash'
+
+Repl = (screen) ->
+  blessed.terminal({
+    parent: screen,
+    cursor: 'line',
+    cursorBlink: true,
+    screenKeys: false,
+    label: ' multiplex.js ',
+    left: 0,
+    top: 0,
+    width: '50%',
+    height: '50%',
+    border: 'line',
+    style: {
+      fg: 'default',
+      bg: 'default',
+      focus: {
+        border: {
+          fg: 'green'
+        }
+      }
+    }
+  })
+
+module.exports = Repl


convert to json before writing

convert to json before writing

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


bug fix

bug fix


fixing script.coffee for last hubot version

--- src/scripts/script.coffee
+++ src/scripts/script.coffee
@@ -27,6 +27,10 @@
     # commands as they are added, there's no other way to access the populated
     # commands array.
     tmpRobot =
+      logger:
+        debug: (debug_msg)->
+          null
+      documentation: {}
       commands:
         push: (command) ->
           msg.send(command)


Keeping track of badge achievers.

Keeping track of badge achievers.

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


Fuzzy find with ripgrep!!

Fuzzy find with ripgrep!!

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


support for stacktrace.* properties

support for stacktrace.* properties

Properties of the first object in the stacktrace array, if present, are
injected as "stacktrace.[property name]" properties in an  xMatters
event

--- plugins/xmatters/index.coffee
+++ plugins/xmatters/index.coffee
@@ -6,8 +6,10 @@
   flatten = (dstObj, srcObj, prefix) ->
     for property of srcObj
       if typeof srcObj[property] == "object"
-        if prefix
-          continue	# nested objects like stackTrace array are not supported
+        # for stacktrace, pick first object
+        if property == "stacktrace" && srcObj[property].length > 0
+          flatten(dstObj, srcObj[property][0], property)
+        continue if prefix	# other nested objects are not supported
         flatten(dstObj, srcObj[property], property)
       else if prefix
         dstObj[ prefix + "." + property] = srcObj[property]


Added missing files

Added missing files

error: pathspec 'services/web/public/coffee/services/queued-http.coffee' did not match any file(s) known to git

--- services/web/public/coffee/services/queued-http.coffee
+++ services/web/public/coffee/services/queued-http.coffee
@@ -0,0 +1,49 @@
+define [
+	"base"
+], (App) ->
+	App.factory "queuedHttp", ($http, $q) ->
+		pendingRequests = []
+		inflight = false
+
+		processPendingRequests = () ->
+			return if inflight
+			doRequest = pendingRequests.shift()
+			if doRequest?
+				inflight = true
+				doRequest()
+					.success () ->
+						inflight = false
+						processPendingRequests()
+					.error () ->
+						inflight = false
+						processPendingRequests()
+
+		queuedHttp = (args...) ->
+			deferred = $q.defer()
+			promise = deferred.promise
+
+			# Adhere to the $http promise conventions
+			promise.success = (callback) ->
+				promise.then(callback)
+				return promise
+
+			promise.error = (callback) ->
+				promise.catch(callback)
+				return promise
+
+			doRequest = () ->
+				$http(args...)
+					.success (successArgs...) ->
+						deferred.resolve(successArgs...)
+					.error (errorArgs...) ->
+						deferred.reject(errorArgs...)
+
+			pendingRequests.push doRequest
+			processPendingRequests()
+
+			return promise
+
+		queuedHttp.post = (url, data) ->
+			queuedHttp({method: "POST", url: url, data: data})
+
+		return queuedHttp


notification message updated

notification message updated


Added a hover zone around the submenu

Added a hover zone around the submenu

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


Add MongoDB flush script

Add MongoDB flush script

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

--- utils/flushMongoDB.coffee
+++ utils/flushMongoDB.coffee
@@ -0,0 +1,59 @@
+MongoClient = require('mongodb').MongoClient
+program = require 'commander'
+
+program
+  .version('1.0.0')
+  .option('-u, --uri [mongouri]', 'MongoDB URI to connect to')
+  .option('-t, --type [datatype]', 'Data type to delete for')
+  .parse(process.argv)
+
+types =
+  arrangementer: {}
+  grupper: {}
+  steder:
+    query: 'tags.0': {$ne: 'Hytte'}
+  hytter:
+    col: 'steder'
+    query: 'tags.0': 'Hytte'
+  bilder: {}
+  turer: {}
+  områder: {}
+
+return program.help() if not program.uri or not program.type or not types[program.type]
+
+type = types[program.type]
+type.col = program.type if not type.col
+type.query.tilbyder = 'DNT' if type.query
+type.query = tilbyder: 'DNT' if not type.query
+
+log = (msg) ->
+  d = new Date()
+  dd = d.getUTCDate()
+  dm = d.getUTCMonth()
+  dy = d.getUTCFullYear()
+  th = d.getUTCHours()
+  tm = d.getUTCMinutes()
+  ts = d.getUTCSeconds()
+  dd = '0' + dd if dd < 10
+  dm = '0' + dm if dm < 10
+  th = '0' + th if th < 10
+  tm = '0' + tm if tm < 10
+  ts = '0' + ts if ts < 10
+
+  console.log "#{dy}-#{dm}-#{dd} #{th}:#{tm}:#{ts} #{msg}"
+
+log 'Connecting to database...'
+MongoClient.connect "#{program.uri}", (err, db) ->
+  throw err if err
+
+  log 'Database is connected!'
+  log "Deleting documents from collection '#{type.col}'..."
+
+  db.collection(type.col).remove type.query, (err, count) ->
+    throw err if err
+    log "#{count} documents deleted!"
+    log 'Closing database connection...'
+    db.close ->
+      log 'Database connection closed!'
+      log 'Shutting down!'
+


Forgot this

Forgot this

[#101488446]

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


pan map on poi select

pan map on poi select


added directory separator constant for wins

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/carlosmarte/console-app.git/'


fix: gruntfile

fix: gruntfile

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


fix sable

fix sable

error: pathspec 'app/lib/field-guide-content/sable_antelope.coffee' did not match any file(s) known to git

--- app/lib/field-guide-content/sable_antelope.coffee
+++ app/lib/field-guide-content/sable_antelope.coffee
@@ -0,0 +1,62 @@
+module.exports =
+  description: '''
+    The sable antelope is a rotund, barrel-chested antelope with a short neck, long face, and dark mane. They are best known for their impressive ringed horns that rise vertically and curve backward. Sable antelopes have a short, glossy coat that appears black in males and sorrel to rich chestnut in females and young. As they grow older, sable antelopes change their coloration. Calves are born reddish-brown, with virtually no markings. As they age, white markings will appear and their coat darkens.
+  '''
+
+  scientificName: '(Hippotragus niger)'
+  mainImage: 'assets/fieldguide-content/mammals/sable_antelope/sable-feature.jpg'
+
+  conservationStatus: 'Least Concern' # Options are Least Concern, Near Threatened, Vulnerable, and Endangered; all have their own little icons as well.
+
+  information: [{
+    label: 'Length'
+    value: '1.97-2.1 m'
+  }, {
+    label: 'Height'
+    value: '1.15-1.4 m'
+  }, {
+    label: 'Weight'
+    value: '204-263 kg'
+  }, {
+    label: 'Lifespan'
+    value: 'Up to 20 years'
+  }, {
+    label: 'Gestation'
+    value: '9 months'
+  }, {
+    label: 'Avg. number of offspring'
+    value: '1'
+  }]
+
+  sections: [{
+    title: 'Habitat'
+    content: 'Sable antelopes are dependent on drinking holes and are often associated with termite mounds. They are generally found in broad-leafed, deciduous woodlands, interspersed with floodplain grasslands.'
+  }, {
+    title: 'Diet'
+    content: 'Primarily grass, sometimes herbs and leaves from shrubs and trees'
+  }, {
+    title: 'Predators'
+    content: 'Lions, leopards, hyenas, hunting dogs, crocodiles, and humans'
+  }, {
+    title: 'Behavior'
+    content: '''
+
Sable antelope females and their young are typically found in small social groups that can contain upward of 75 individuals. A cow herd’s home range is generally between 10 and 25 square km (4-10 square miles) and will overlap with the territory of up to five bulls. Males with the best territories generally have the best mating success.

+    '''
+  }, {
+    title: 'Breeding'
+    content: '''
+
Sable antelopes give birth annually to one calf born after a gestation period of about 9 months. When a female is ready to give birth, she will leave the herd and seek a secluded place in the bush. After giving birth, the mother will leave the calf hidden in the tall grass or bush, returning once or twice a day to nurse. After a couple of weeks, once the calf is strong enough, the calf will accompany its mother back to the herd.

+    '''
+  }, {
+    title: 'Fun Facts'
+    style: 'focus-box'
+    content: '''
+

+
A sable antelope’s horns can reach 5.5 feet in length.

+

+

+    '''
+  },{
+    title: 'Distribution'
+    content: ''
+  }]


Teamwork: Fix the usage of oskite.exec which now expects err, response which response includes exitStatus, stdout and stderr

--- client/ide/filetree/helpers/dropboxuploader.coffee
+++ client/ide/filetree/helpers/dropboxuploader.coffee
@@ -16,8 +16,8 @@
     vmController.run
       withArgs   : command
       vmName     : nodeView.getData().vmName
-    , (err, res) =>
-      if err
+    , (err, res)->
+      if err or res.exitStatus > 0
         notification.notificationSetTitle "An error occured. Please try again."
         notification.notificationSetTimer 4000
         notification.setClass "error"


Fetch private messages after opening the Inbox app

--- client/landing/app/CommonViews/messagesList.coffee
+++ client/landing/app/CommonViews/messagesList.coffee
@@ -164,6 +164,7 @@

     if @snapshot.anchor.constructorName is "JPrivateMessage"
       appManager.openApplication "Inbox"
+      appManager.tell 'Inbox', "goToMessages"
     else if @snapshot.anchor.constructorName in ["JComment", "JReview"]
       KD.remote.api[@snapshot.anchor.constructorName].fetchRelated @snapshot.anchor.id, showPost
     else


Hiding images smaller than 100px as a test

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


Update teitoku-panel.cjsx

Update teitoku-panel.cjsx

--- views/components/main/parts/teitoku-panel.cjsx
+++ views/components/main/parts/teitoku-panel.cjsx
@@ -34,7 +34,7 @@
     level: 0
     nickname: null
     rank: 0
-    nextExp:'?'
+    nextExp: '?'
     material: ['??', '??', '??', '??', '??', '??', '??', '??', '??']
     shipCount: '??'
     maxChara: '??'
@@ -48,7 +48,7 @@
           level: body.api_level
           nickname: body.api_nickname
           rank: body.api_rank
-          nextExp:totalExp[body.api_level] - body.api_experience
+          nextExp: totalExp[body.api_level] - body.api_experience
           maxChara: body.api_max_chara
           maxSlotitem: body.api_max_slotitem
       when '/kcsapi/api_req_sortie/battleresult'


add generator

add generator

error: pathspec 'atmospheric/002-accumulated-heat/generator.coffee' did not match any file(s) known to git

--- atmospheric/002-accumulated-heat/generator.coffee
+++ atmospheric/002-accumulated-heat/generator.coffee
@@ -0,0 +1,29 @@
+###
+  generator.coffee
+
+  a demo generator for terrain forming
+###
+define [
+  'exports'
+  'cs!/wahlque/universe/wahlque/planet/terrain'
+], (exports, terrain) ->
+    handle = 0
+    counter = 0
+    start = () ->
+        seeds = terrain.seeds()
+        evolve = ->
+            if counter < 6
+                seeds = terrain.gen(seeds)
+                counter = counter + 1
+                self.postMessage({trn: seeds})
+            else
+                self.postMessage({msg: 'done!'})
+                clearInterval(handle)
+        handle = setInterval(evolve, 5000)
+
+    self.onmessage = (e) ->
+        start()
+        true
+
+    exports
+


Collaboration: Participant polls realtime document

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


status bar view

status bar view

error: pathspec 'lib/status-bar-view.coffee' did not match any file(s) known to git

--- lib/status-bar-view.coffee
+++ lib/status-bar-view.coffee
@@ -0,0 +1,22 @@
+{$, $$, View} = require 'atom'
+
+module.exports =
+  class JekyllStatus extends View
+    @content: ->
+      @div class:'inline-block', =>
+        @span click: 'openToolbar', id: 'jekyllStatusLink', "Jekyll Server"
+
+    initialize: (emitter) ->
+      @emitter = emitter
+
+      @emitter.on 'jekyll:server-status-reply', (status) ->
+        console.log status
+        if status is 'On'
+          $('#jekyllStatusLink').addClass('text-success')
+        else
+          $('#jekyllStatusLink').removeClass('text-success')
+
+      @emitter.emit 'jekyll:server-status'
+
+    openToolbar: ->
+      atom.workspaceView.trigger 'jekyll:toolbar'


Don't open untitled editor on Atom start

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


fixed make spec

fixed make spec

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


Remove unused #noop() method.

Remove unused #noop() 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/'


Refactor promise resolution procedure.

Refactor promise resolution procedure.

Moves the promise resolution procedure to a private static method
Promise.__resolve and splits different resolution procedures (based on
resolving value) to separate functions to improve readability.


Add menu items

Add menu items

error: pathspec 'menus/dev-live-reload.cson' did not match any file(s) known to git

--- menus/dev-live-reload.cson
+++ menus/dev-live-reload.cson
@@ -0,0 +1,9 @@
+'menu': [
+  'label': 'Packages'
+  'submenu': [
+    'label': 'Dev Live Reload'
+    'submenu': [
+      { 'label': 'Reload All Styles', 'command': 'dev-live-reload:reload-all' }
+    ]
+  ]
+]


Override Router methods in URLRouter to support common methods.

- Add #clear(), #registered(), and #remove() methods to URLRouter which
  take a string or regular expression argument. URLRouter now has internal
  private data structure to track added routes based on their string or
  regular expression value.


Added a new date input directive that bridges formatted and unformatted dates

error: pathspec 'src/main/client/grid/grid-directives-pages.coffee' did not match any file(s) known to git

--- src/main/client/grid/grid-directives-pages.coffee
+++ src/main/client/grid/grid-directives-pages.coffee
@@ -0,0 +1,25 @@
+angular
+  .module 'tracker.grid'
+
+  .directive 'trackerDateInput', () ->
+    result =
+      restrict: "A"
+      require: '?ngModel'
+      link: (scope, element, attrs, ngModel) ->
+        console.log "Called trackerDateInput", ngModel, scope.study?.options?.dateFormat
+        return if ! ngModel
+
+        dateFormat = scope.study?.options?.dateFormat || "YYYY-MM-DD"
+
+        formatter = (v) ->
+          moment(v).format(dateFormat)
+
+        parser = (v) ->
+          value = moment(v, dateFormat)
+          if value.isValid()
+            value.format("YYYY-MM-DD")
+          else
+            undefined
+
+        ngModel.$formatters.push(formatter)
+        ngModel.$parsers.push(parser)


Adding keymaster.js for keybinding configuration

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

--- app/assets/javascripts/luca/util/keybindings.coffee
+++ app/assets/javascripts/luca/util/keybindings.coffee
@@ -0,0 +1,24 @@
+# Luca.util.setupKeymaster(config, keyScope).on(view)
+#
+# Keymaster understands the following modifiers:
+# `⇧`, `shift`, `option`, `⌥`, `alt`, `ctrl`, `control`, `command`, and `⌘`.
+
+# The following special keys can be used for shortcuts:
+# `backspace`, `tab`, `clear`, `enter`, `return`, `esc`, `escape`, `space`,
+# `up`, `down`, `left`, `right`, `home`, `end`, `pageup`, `pagedown`, `del`, `delete`
+# and `f1` through `f19`.
+#
+Luca.util.setupKeymaster = (config, keyScope="all")->
+  unless _.isFunction(Luca.key)
+    throw "Keymaster library has not been included."
+
+  console.log "Setup Key Master Scope: #{ keyScope }", config
+
+  on: (view)->
+    for key, handler of config
+      if _.isString(handler) and _.isFunction(view[handler])
+        handler = view[handler]
+
+      if _.isFunction(handler)
+        handler = _.bind(handler, view)
+        Luca.key(key, keyScope, handler)


Script for gangnam style gif generator

Script for gangnam style gif generator

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

--- src/scripts/gangnam.coffee
+++ src/scripts/gangnam.coffee
@@ -0,0 +1,24 @@
+# Description:
+#   Produces a random gangnam style gif
+#
+# Dependencies:
+#   None
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot oppa gangnam style - Return random gif from gifbin.com
+#
+# Author:
+#   EnriqueVidal
+
+gifs = [
+  "http://i1.kym-cdn.com/photos/images/original/000/370/936/cb3.gif",
+  "http://i3.kym-cdn.com/photos/images/original/000/363/835/32a.gif",
+  "http://knowyourmeme.com/photos/388760-gangnam-style",
+  "http://i2.kym-cdn.com/photos/images/original/000/386/610/52d.gif"
+  ]
+
+module.exports = (robot)->
+  robot.hear /oppa gangnam style/i, (message)-> #changed gifbin
+    message.send message.random gifs


added the espn script to scripts

added the espn script to scripts

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

--- src/scripts/espn.coffee
+++ src/scripts/espn.coffee
@@ -0,0 +1,32 @@
+# Description:
+#   Grab a headline from ESPN
+#
+# Dependencies:
+#   ESPN API Key
+#
+# Configuration:
+#   Insert your ESPN API Key into the URL
+#
+# Commands:
+#   hubot espn - Displays a random headline from ESPN.com
+#
+# Author:
+#   mjw56
+
+module.exports = (robot) ->
+  robot.respond /espn/i, (msg) ->
+    search = escape(msg.match[1])
+    msg.http('http://api.espn.com/v1/sports/news/headlines?apikey=<YOUR ESPN API KEY>')
+      .get() (err, res, body) ->
+        result = JSON.parse(body)
+
+        if result.headlines.count <= 0
+          msg.send "Couldn't find any headlines"
+          return
+
+        urls = [ ]
+        for child in result.headlines
+          urls.push(child.headline + ":  " + child.links.web.href)
+
+        rnd = Math.floor(Math.random()*urls.length)
+        msg.send urls[rnd]


refactoring

refactoring

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


Create test.coffee

Create test.coffee

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

--- scripts/test.coffee
+++ scripts/test.coffee
@@ -0,0 +1,18 @@
+module.exports = function (robot) {
+
+    var switchBoard = new Conversation(robot);
+
+    robot.respond(/clean the house/, function (msg) {
+        var dialog = switchBoard.startDialog(msg);
+
+        msg.reply('Sure, where should I start? Kitchen or Bathroom');
+        dialog.addChoice(/kitchen/i, function (msg2) {
+            msg2.reply('On it boss!');
+        });
+        dialog.addChoice(/bathroom/i, function (msg2) {
+            msg.reply('Do I really have to?');
+            dialog.addChoice(/yes/, function (msg3) {
+                msg3.reply('Fine, Mom!');
+            })
+        });
+    });


Fixed: bank access was not removed

Fixed: bank access was not removed

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/goofy-bz/kresus.git/'


locked release version to 1.2 temporarily

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


update discussion "can't unpublish" tooltip

fixes CNVS-9941

test plan:
  * enable draft state in a course;
  * create a discussion, publish it, and post a reply on it;
  * mouse over the publish button on the discussion show
    page and verify that the tooltip reads, "Can't unpublish
    if there are replies."

Change-Id: I86a264e57343611dccb9e589be7c9977b79702fc
Reviewed-on: https://gerrit.instructure.com/27548
Reviewed-by: Joel Hough <4816dabf8db1bc6cac35b3a24cab2ff844b5b0c7@instructure.com>
Tested-by: Jenkins <d95b56ce41a2e1ac4cecdd398defd7414407cc08@instructure.com>
QA-Review: Matt Fairbourn <5f353e1c97bb9cc046b9db20beca0b9392f6f1b2@instructure.com>
Product-Review: Zach Pendleton <514dbb4d54d4f29e454990df7d075678f43f92aa@instructure.com>

--- app/coffeescripts/models/DiscussionTopic.coffee
+++ app/coffeescripts/models/DiscussionTopic.coffee
@@ -56,7 +56,7 @@
     unpublish: ->
       @updateOneAttribute('published', false)

-    disabledMessage: -> I18n.t 'cannot_unpublish', "Can't unpublish"
+    disabledMessage: -> I18n.t 'cannot_unpublish_with_replies', "Can't unpublish if there are replies"

     topicSubscribe: ->
       baseUrl = _.result this, 'url'


:new: Initial Implementation of Expected Write

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

--- Source/ExpectedWrite.coffee
+++ Source/ExpectedWrite.coffee
@@ -0,0 +1,33 @@
+# @Compiler-Output "../Dist/ExceptedWrite.js"
+
+EventEmitter = require('events').EventEmitter
+Promise = require('a-promise')
+Buffer = require('buffer').Buffer
+
+class ExpectedWrite extends EventEmitter
+  constructor: (@stream) ->
+    super
+    @status = true
+    @expected = null
+    @callback = null
+    @data = stdout: new Buffer("", "utf8"), stderr: new Buffer("", "utf8")
+
+    @stream.on 'close', =>
+      @emit('end')
+    if @stream.stdout
+      @stream.stdout.on 'data', (data) =>
+        @data.stdout = Buffer.concat([@data.stdout, data])
+    else
+      @stream.on 'data', (data) =>
+        @data.stdout = Buffer.concat([@data.stdout, data])
+    @stream.stderr.on 'data', (data) =>
+      @data.stderr = Buffer.concat([@data.stderr, data])
+
+  onEnd: ->
+    return new Promise (Resolve)=>
+      if @status
+        @once('end', Resolve)
+      else
+        Resolve()
+
+module.exports = ExpectedWrite


Add Amazon search.

Add Amazon search.

error: pathspec 'config/jkn2-amazon.coffee' did not match any file(s) known to git

--- config/jkn2-amazon.coffee
+++ config/jkn2-amazon.coffee
@@ -0,0 +1,10 @@
+
+configs = []
+
+configs.push
+  name: "Amazon Search"
+  regexps: "^https?://www\\.amazon\\.[^/]+/s/"
+  selectors: "div#resultsCol li[id^='result_']"
+
+require("../common.js").Common.mkConfigs configs, name: "Amazon Search"
+


working bad dates

working bad dates

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/michael-lumley/DA-Database.git/'


Uncommented some translations from last merge

--- app/locale/it.coffee
+++ app/locale/it.coffee
@@ -6,7 +6,7 @@
     play: "Gioca" # The big play button that opens up the campaign view.
     old_browser: "Accidenti, il tuo browser è troppo vecchio per giocare a CodeCombat. Mi spiace!" # Warning that shows up on really old Firefox/Chrome/Safari
     old_browser_suffix: "Puoi provare lo stesso, ma probabilmente non funzionerà."
-#    ipad_browser: "Bad news: CodeCombat non run on iPad nel browser. Good news: our native iPad app is awaiting Apple approval."
+    ipad_browser: "Bad news: CodeCombat non run on iPad nel browser. Good news: our native iPad app is awaiting Apple approval."
     campaign: "Campagna"
     for_beginners: "Per Principianti"
     multiplayer: "Multiplayer" # Not currently shown on home page
@@ -92,14 +92,14 @@
     campaign_classic_algorithms: "Algoritmi classici"
     campaign_classic_algorithms_description: "... in cui impari i più comuni algoritmi dell'informatica."

-#  share_progress_modal:
+  share_progress_modal:
 #    blurb: "You’re making great progress! Tell someone how much you've learned with CodeCombat."
-#    email_invalid: "Indirizzo Email invalid."
-#    form_blurb: "Enter il suo email below and we’ll show them!"
+    email_invalid: "Indirizzo Email invalid."
+    form_blurb: "Enter il suo email below and we’ll show them!"
     form_label: "Indirizzo Email"
 #    placeholder: "email address"
-#    title: "Excellent Lavoro, Apprentice"
-#    tell_friend: "Tell your Amico"
+    title: "Excellent Lavoro, Apprentice"
+    tell_friend: "Tell your Amico"
 #    tell_parent: "Tell your Parent"

   login:
@@ -175,8 +175,8 @@
     commit_msg: "Messaggio di commit"
 #    review: "Review"
 #    version_history: "Version History"
-#    version_history_for: "Version History per: "
-#    select_changes: "Select due changes below per vedere la diferenza."
+    version_history_for: "Version History per: "
+    select_changes: "Select due changes below per vedere la diferenza."
     undo_prefix: "Annulla"
     undo_shortcut: "(Ctrl+Z)"
     redo_prefix: "Ripristina"
@@ -253,7 +253,7 @@
     victory_sign_up: "Registrati per gli aggiornamenti"
     victory_sign_up_poke: "Vuoi ricevere le ultime novità per email? Crea un account gratuito e ti terremo aggiornato!"
     victory_rate_the_level: "Vota il livello: " # Only in old-style levels.
-#    victory_return_to_ladder: "Ritorna to Ladder"
+    victory_return_to_ladder: "Ritorna to Ladder"
     victory_play_continue: "Continua"
     victory_saving_progress: "Salvataggio progressi"
     victory_go_home: "Torna alla pagina iniziale" # Only in old-style levels.
@@ -277,7 +277,7 @@
     tome_available_spells: "Incantesimi disponibili"
     tome_your_skills: "Le tue Abilità"
     tome_help: "Aiuto"
-#    tome_current_method: "Metodo Attuale"
+    tome_current_method: "Metodo Attuale"
     hud_continue_short: "Continua"
     code_saved: "Codice salvato"
     skip_tutorial: "Salta (esc)"
@@ -292,9 +292,9 @@
     infinite_loop_try_again: "Riprova"
     infinite_loop_reset_level: "Riavvia livello"
     infinite_loop_comment_out: "Commenta il codice"
-#    tip_toggle_play: "Scambia play/paused con Ctrl+P."
+    tip_toggle_play: "Scambia play/paused con Ctrl+P."
 #    tip_scrub_shortcut: "Ctrl+[ and Ctrl+] rewind and fast-forward."
-#    tip_guide_exists: "Click la guida, inside menu di gioco (at the top of the page), per informazione useful."
+    tip_guide_exists: "Click la guida, inside menu di gioco (at the top of the page), per informazione useful."
     tip_open_source: "CodeCombat è 100% codigo libero!"
 #    tip_beta_launch: "CodeCombat launched its beta in October, 2013."
 #    tip_think_solution: "Think of the solution, not the problem."
@@ -304,23 +304,23 @@
 #    tip_forums: "Head over to the forums and tell us what you think!"
 #    tip_baby_coders: "In the future, even babies will be Archmages."
 #    tip_morale_improves: "Loading will continue until morale improves."
-#    tip_all_species: "Crediamo in equal opportunities to learn programming for all species."
+    tip_all_species: "Crediamo in equal opportunities to learn programming for all species."
 #    tip_reticulating: "Reticulating spines."
 #    tip_harry: "Yer a Wizard, "
 #    tip_great_responsibility: "With great coding skill comes great debug responsibility."
-#    tip_munchkin: "Se you don't eat your vegetables, a munchkin will come after you while you're asleep."
+    tip_munchkin: "Se you don't eat your vegetables, a munchkin will come after you while you're asleep."
 #    tip_binary: "There are only 10 types of people in the world: those who understand binary, and those who don't."
 #    tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda"
 #    tip_no_try: "Do. Or do not. There is no try. - Yoda"
 #    tip_patience: "Patience you must have, young Padawan. - Yoda"
-#    tip_documented_bug: "A documented bug is not a bug; it è una feature."
+    tip_documented_bug: "A documented bug is not a bug; it è una feature."
 #    tip_impossible: "It always seems impossible until it's done. - Nelson Mandela"
-#    tip_talk_is_cheap: "Parlare è cheap. Mostrami il codigo. - Linus Torvalds"
+    tip_talk_is_cheap: "Parlare è cheap. Mostrami il codigo. - Linus Torvalds"
 #    tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay"
-#    tip_hardware_problem: "D: Quanti programmers does it take to change a light bulb?  A: None, it's a hardware problem."
+    tip_hardware_problem: "D: Quanti programmers does it take to change a light bulb?  A: None, it's a hardware problem."
 #    tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law."
 #    tip_premature_optimization: "Premature optimization is the root of all evil. - Donald Knuth"
-#    tip_brute_force: "Quando in doubt, use forza bruta. - Ken Thompson"
+    tip_brute_force: "Quando in doubt, use forza bruta. - Ken Thompson"
     tip_extrapolation: "Ci sono soltanto due tipi di persone: quelli che possono extrapolare da i dati incompleti..."
 #    tip_superpower: "Coding is the closest thing we have to a superpower."
 #    tip_control_destiny: "In real open source, you have the right to control your own destiny. - Linus Torvalds"
@@ -367,7 +367,7 @@
 #    damage_taken: "Damage Taken"
 #    damage_dealt: "Damage Dealt"
     difficulty: "Difficoltà"
-#    gold_collected: "Oro Collected"
+    gold_collected: "Oro Collected"

   inventory:
     choose_inventory: "Equipaggiamento"
@@ -397,9 +397,9 @@

   subscribe:
 #    comparison_blurb: "Sharpen your skills with a CodeCombat subscription!"
-#    feature1: "60+ basic livelli across 4 mondi"
+    feature1: "60+ basic livelli across 4 mondi"
 #    feature2: "7 powerful new heroes with unique skills!"
-#    feature3: "30+ bonus livelli"
+    feature3: "30+ bonus livelli"
 #    feature4: "3500 bonus gems every month!"
 #    feature5: "Video tutorials"
 #    feature6: "Premium email support"
@@ -544,12 +544,12 @@
 #    cat_blurb: "Airbender"
 #    josh_title: "Game Designer"
 #    josh_blurb: "Floor Is Lava"
-#    jose_title: "Musico"
+    jose_title: "Musico"
 #    jose_blurb: "Taking Off"
 #    retrostyle_title: "Illustration"
 #    retrostyle_blurb: "RetroStyle Games"

-#  teachers:
+  teachers:
 #    title: "CodeCombat for Teachers"
 #    preparation_title: "Preparation"
 #    preparation_1: "CodeCombat is free to play for the core level progression and does not require students to sign up. We encourage teachers to"