Updates to keys

Updates to keys

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


landing: fix reference error

landing: fix reference error

Signed-off-by: Umut Sirin <4055abbc0e40a1254e715b952ccd414607e0b365@gmail.com>

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


remove this modifier in routes conf dummy

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


Added example script

Added example script

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

--- examples/gatherdata.coffee
+++ examples/gatherdata.coffee
@@ -0,0 +1,44 @@
+pypi = require 'pypi'
+_    = require 'underscore'
+
+
+client = new pypi.Client "http://pypi.python.org/pypi"
+
+if process.argv.length != 3
+    console.log "usage: coffee gatherdata.coffee PACKAGE_NAME"
+    process.exit 1
+else
+    package = process.argv[2]
+
+client.getPackageReleases package, (versions) ->
+    toFetch = versions.length
+
+    data = {versions: {}}
+
+    totalDownloads = 0
+    totalUrls = 0
+
+    latestVersion = versions.length and _.clone(versions).sort()[versions.length - 1]
+
+    _.each versions, (version) ->
+        client.getReleaseUrls package, version, (urls) ->
+
+            for urlData in urls
+                totalDownloads += urlData.downloads
+                totalUrls += 1
+                date = new Date urlData.upload_time
+
+            toFetch--
+            if toFetch == 0
+                onDone()
+
+    onDone = ->
+        console.log "Package: #{package}"
+        console.log "Versions count: #{versions.length}"
+        console.log "Total urls count: #{totalUrls}"
+        console.log "Total downloads: #{totalDownloads}"
+        console.log "Latest version: #{latestVersion}"
+
+
+        process.exit(0)
+


Initial commit

Initial commit

Grammar of Proteome Query Language.
pQL®: An efficient Proteome Query Language.
BioQL®: An efficient Query Language for interpreting genome and proteome.
Author: Prabhat Kumar, http://prabhatkumar.org/.
Copyright: Sequømics Corporation, http://sequomics.com/.

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


Bump version to 1.1.0

Bump version to 1.1.0

--- app.coffee
+++ app.coffee
@@ -1,4 +1,4 @@
-global.POI_VERSION = '1.0.0'
+global.POI_VERSION = '1.1.0'

 app = require 'app'
 BrowserWindow = require 'browser-window'


Set the value as undefined first.

Set the value as undefined first.

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


move milestone start date to the first closed issue if came sooner

--- src/views/chart.coffee
+++ src/views/chart.coffee
@@ -12,6 +12,11 @@
     issues = milestone.issues
     # Total number of points in the milestone.
     total = issues.open.size + issues.closed.size
+
+    # An issue may have been closed before the start of a milestone.
+    if issues.length and milestone.created_at > issues[0].closed_at
+      # This is the new start.
+      milestone.created_at = issues[0].closed_at

     # Actual, ideal & trend lines.
     actual = lines.actual issues.closed.list, milestone.created_at, total
@@ -120,4 +125,4 @@
     .attr("cy", ({ points }) -> y points )
     .attr("r",  ({ radius }) -> 5 ) # fixed for now
     .on('mouseover', tooltip.show)
-    .on('mouseout', tooltip.hide)+    .on('mouseout', tooltip.hide)


Added FinderPane.

Added FinderPane.


Added catch for 'individual performance' pie charts, so that if only one player is on the board, chart will be drawn as one solid circle.

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


Added pointer_over sensor.

Added pointer_over sensor.

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

--- engine/sensors.coffee
+++ engine/sensors.coffee
@@ -0,0 +1,20 @@
+{mat2, mat3, mat4, vec2, vec3, vec4, quat} = require 'gl-matrix'
+phy = require './physics'
+pointer_over = (x, y, cam, int_mask)->
+    scene = cam.scene
+    context = cam.scene.context
+    events = context.events
+    pos = cam.get_world_position()
+    {width, height} = context.canvas_rect
+
+    x = x/width*2 - 1
+    y = 1 - y/height*2
+
+    rayto = cam.get_ray_direction(x,y)
+
+    vec3.add(rayto, rayto, pos)
+    vec3.copy(context.objects.Icosphere.position, rayto)
+
+    return phy.ray_intersect_body_absolute scene, pos, rayto, int_mask
+
+module.exports = {pointer_over}


Extract getAbilities method [bcd91dc6d18f2f5123c5cd340d7ce15acb7818ca]

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


More randomness

More randomness

--- bot.coffee
+++ bot.coffee
@@ -1,58 +1,28 @@
 ###

   Random bot: an example bot to illustrate how easy it is to write one.
-
-  It doesn't do much: starts with a fixed config and plays a random, valid move.
-
   Author: Mikolaj Pawlikowski (mikolaj@pawlikowski.pl)

 ###

+state = JSON.parse process.argv.slice(2)

-# this is a very simple bot, it always starts the same
-config =
-  2:
-    point: "00"
-    orientation: "vertical"
-  3:
-    point: "22"
-    orientation: "vertical"
-  4:
-    point: "42"
-    orientation: "vertical"
-  5:
-    point: "37"
-    orientation: "horizontal"
+rand = (n) ->
+  Math.round(Math.random()*n)

-randomMove = ->
-  "#{Math.round(Math.random()*7)}#{Math.round(Math.random()*7)}"
-
-
-# get and parse the state
-# it will be called like so:
-#     coffee bot.coffee "{'cmd':'init'}"
-
-incoming = JSON.parse process.argv.slice(2)
-
-# they want us to set up our ships
-if incoming.cmd is 'init'
+if state.cmd is 'init'
+  diff = 0
+  config = {}
+  for i in [2..5]
+    diff += rand(1)
+    config[i] =
+      point: "#{rand(7-i)}#{diff}"
+      orientation: "horizontal"
   console.log JSON.stringify config

-# otherwise, let's play!
-# we should get something like this:
-# {
-#     "cmd": "move",
-#
-#     "moves": ["0001", "1003", "1113"], // an array representing the the sequence of moves and results (see below)
-#
-#     "hit"       : ["20", "30"],  // the cells shot at and hit
-#     "missed"    : ["44", "01"],  // the cells shot at but missed
-#     "destroyed" : [2]            // sizes (2, 3, 4, 5) of destroyed opponent's ships
-# }
 else
   move = randomMove()
-  while (move in incoming.hit) or (move in incoming.missed)
+  while (move in state.hit) or (move in state.missed)
     move = randomMove()
   console.log JSON.stringify
     move: move
-  process.exit 0


Upload AtomSetup.exe on Windows

Upload AtomSetup.exe on Windows

--- build/tasks/publish-build-task.coffee
+++ build/tasks/publish-build-task.coffee
@@ -54,6 +54,8 @@
           uploadAssets(release, buildDir, assets, done)

 getAssets = ->
+  {cp} = require('./task-helpers')(grunt)
+
   switch process.platform
     when 'darwin'
       [
@@ -62,8 +64,11 @@
         {assetName: 'atom-api.json', sourcePath: 'atom-api.json'}
       ]
     when 'win32'
+      cp path.join(buildDir, 'installer', 'AtomSetup.exe', path.join(buildDir, 'AtomSetup.exe')
+
       [
         {assetName: 'atom-windows.zip', sourcePath: 'Atom'}
+        {assetName: 'AtomSetup.exe', sourcePath: 'AtomSetup.exe'}
       ]
     when 'linux'
       buildDir = grunt.config.get('atom.buildDir')
@@ -87,7 +92,6 @@
           arch = 'x86_64'
         assetName = "atom.#{arch}.rpm"

-      {cp} = require('./task-helpers')(grunt)
       cp sourcePath, path.join(buildDir, assetName)

       [


http listener for logging

http listener for logging

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

--- scripts/httpd.coffee
+++ scripts/httpd.coffee
@@ -0,0 +1,32 @@
+# Description:
+#   A simple interaction with the built in HTTP Daemon
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   None
+#
+# URLS:
+#   /hubot/log/:room
+#
+# Author:
+#   yulii
+
+module.exports = (robot) ->
+
+  ## Notify a log message
+  robot.router.post "/hubot/log/:room", (req, res) ->
+    user = room: "##{req.params.room}"
+    console.log(req.body)
+    data = req.body
+    message = "[#{data.level.toUpperCase()}] #{data.message}"
+    if /FATAL/i.test(data.level) or /ERROR/i.test(data.level)
+      message += " @channel"
+
+    robot.send user, message
+    res.end "OK\n"
+


basic dereferencing

basic dereferencing

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


Add bowercopy task

Add bowercopy task

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

--- grunt/bowercopy.coffee
+++ grunt/bowercopy.coffee
@@ -0,0 +1,2 @@
+module.exports =
+  'src/bezier-easing.js': 'bezier-easing/bezier-easing.js'


Update settings

Update settings

--- helper/settings.coffee
+++ helper/settings.coffee
@@ -10,7 +10,7 @@
     file
     "#{splinters.dir}/#{splinters.name}.specific#{splinters.ext}"
     "#{splinters.dir}/#{splinters.name}.local#{splinters.ext}"
-    "~/.fixin/settings/#{splinters.name}.private#{splinters.ext}"
+    "#{process.env[if process.platform is "win32" then "USERPROFILE" else "HOME"]}/.fixin/settings/#{splinters.name}.private#{splinters.ext}"
   ]
   for file in files
     if fs.existsSync(file)


Tambah Model Post

Tambah Model Post

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/RizkiMufrizal/Aplikasi-Post-Status.git/'


Remove pointless interpolation

Remove pointless interpolation

--- resources/assets/coffee/react/_components/beatmapset-panel.coffee
+++ resources/assets/coffee/react/_components/beatmapset-panel.coffee
@@ -99,10 +99,10 @@
               if showHypeCounts
                 div null,
                   div className: 'beatmapset-panel__count', title: osu.trans('beatmaps.hype.required_text', {current: currentHype, required: requiredHype}),
-                    span className: 'beatmapset-panel__count-number', "#{currentHype}"
+                    span className: 'beatmapset-panel__count-number', currentHype
                     el Icon, name: 'bullhorn', modifiers: ['fw']
                   div className: 'beatmapset-panel__count', title: osu.trans('beatmaps.nominations.required_text', {current: currentNominations, required: requiredNominations}),
-                    span className: 'beatmapset-panel__count-number', "#{currentNominations}"
+                    span className: 'beatmapset-panel__count-number', currentNominations
                     el Icon, name: 'thumbs-up', modifiers: ['fw']
               else
                 div className: 'beatmapset-panel__count',


Add correct formatting to play/favourite counts

--- resources/assets/coffee/react/_components/beatmapset-panel.coffee
+++ resources/assets/coffee/react/_components/beatmapset-panel.coffee
@@ -90,11 +90,11 @@

             div className: 'beatmapset-panel__counts-box',
               div className: 'beatmapset-panel__count',
-                span className: 'beatmapset-panel__count-number', beatmapset.play_count
+                span className: 'beatmapset-panel__count-number', beatmapset.play_count.toLocaleString()
                 el Icon, name: 'play-circle', modifiers: ['fw']

               div className: 'beatmapset-panel__count',
-                span className: 'beatmapset-panel__count-number', beatmapset.favourite_count
+                span className: 'beatmapset-panel__count-number', beatmapset.favourite_count.toLocaleString()
                 el Icon, name: 'heart', modifiers: ['fw']

             div


initial commit of a toggl script

initial commit of a toggl script

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

--- scripts/toggl.coffee
+++ scripts/toggl.coffee
@@ -0,0 +1,16 @@
+# Get our toggl statuses
+#
+
+module.exports = (robot) ->
+  robot.respond /toggl keyadd (.*)/i, (msg) ->
+    togglKey = msg.match[1]
+    msg.message.user.togglKey = togglKey
+    msg.send "Ok, " + msg.message.user.name + ", I added your toggl key."
+
+  robot.respond /toggl keydel (.*)/i, (msg) ->
+    user = msg.message.user
+    user.togglKey = null
+    msg.reply("Ok, I lost your toggl key.")
+
+  robot.respond /toggl status/i, (msg) ->
+    msg.send "Stub function.  This is where I would loop through the api keys I have stored and display that status for each of you."


Show file type on file upload error. Fix #3217

--- packages/rocketchat-ui/lib/fileUpload.coffee
+++ packages/rocketchat-ui/lib/fileUpload.coffee
@@ -27,8 +27,9 @@
 			if not RocketChat.fileUploadIsValidContentType file.file.type
 				swal
 					title: t('FileUpload_MediaType_NotAccepted')
+					text: file.file.type || "*.#{s.strRightBack(file.file.name, '.')}"
 					type: 'error'
-					timer: 1000
+					timer: 3000
 				return

 			if file.file.size is 0


added config to echo the current input as a choice

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


added method to clear all tokens

added method to clear all tokens


cleaned up config/application.coffee

cleaned up config/application.coffee

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


Open drawer from web component several times

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


增加 \think\Config 片段

增加 \think\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/chunice/atom-thinkphp5-snippets.git/'


fix: compatibility issues with IE (dataset)

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/fczbkk/element-monitor.git/'


update acceptance test generator

update acceptance test generator

Newer versions of QUnit use the return value of `setup` and `teardown` to wait for promises if the return value has a `.then` function. There are a few problems with this:

1) Ember.Application.then is deprecated
2) The promise never resolves if you are calling `visit`/etc in the test block. The code to make the promise resolved can't run before setup is done (`test` waits for `setup`).

This fixes `ember generate acceptance-test` hanging by default.

--- blueprints/acceptance-test/files/tests/acceptance/__name__-test.coffee
+++ blueprints/acceptance-test/files/tests/acceptance/__name__-test.coffee
@@ -6,6 +6,12 @@
 module 'Acceptance: <%= classifiedModuleName %>',
   setup: ->
     application = startApp()
+    ###
+    return null as Ember.Application.then is deprecated.
+    Newer version of QUnit uses the return value's .then
+    function to wait for promises if it exists.
+    ###
+    null

   teardown: ->
     Ember.run application, 'destroy'


Add test for cache

Add test for cache

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

--- test/weird_test.coffee
+++ test/weird_test.coffee
@@ -0,0 +1,6 @@
+test 'weirdness', ->
+  worker 'top', ->
+    _.flatten @all x: ['foo'], -> @y()
+  worker 'y', 'x', -> []
+  setup -> request 'top'
+  want []


Refs #104; Removed debug statements.

Refs #104; Removed debug statements.

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


Add Template model Created a Template model for storing templates in the database. Adding this commit as a starting point before diving into API changes.

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

--- server/models/template.coffee
+++ server/models/template.coffee
@@ -0,0 +1,21 @@
+mongoose = require 'mongoose'
+db = require '../lib/database'
+
+# We should be mindful of potential exploits in user-provided input,
+# but MongoDB appears to be safe for the basic use case.
+# http://docs.mongodb.org/manual/faq/developers/#how-does-mongodb-address-sql-or-query-injection
+
+Template = new mongoose.Schema
+  name:
+    type: String
+    required: true
+  contents: String
+  date_created:
+    type: date
+    default: Date.now
+  last_modified:
+    type: Date
+    default: Date.now
+  tags: [String]
+
+module.exports = db.model('Template', Template)


filereading attempt 10

filereading attempt 10

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


Added Variables.coffee to store the shared cagen variables.

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

--- src/Variables.coffee
+++ src/Variables.coffee
@@ -0,0 +1,28 @@
+###
+Variables.coffee
+
+@author Destin Moulton
+@git https://github.com/destinmoulton/cagen
+@license MIT
+
+Component of Cellular Automata Generator (CAGEN)
+
+Manage variables for the cagen components.
+
+###
+
+class Variables
+
+    constructor: ()->
+        @jMainContainer = $("#cagen-container")
+        @currentRule = 0
+        @topRowBinaryArray = []
+
+    setCurrentRule: (newRule)->
+        @currentRule = newRule
+
+    setTopRowBinary: (newBinary)->
+        @topRowBinaryArray = newBinary
+
+    getTopRowBinary: ()->
+        return @topRowBinaryArray


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


将httpclient 简单封装并剥离

将httpclient 简单封装并剥离

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


added streaks to Staircase so we don't have to change intensity every trial

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


bug fix

bug fix


TODO for dates-picker directive

TODO for dates-picker directive

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/xaun/impac-angular.git/'


Bug fix to getting private IP address

Bug fix to getting private IP address


Remove one level of indent for coffee-lint.

--- app/core/utils.coffee
+++ app/core/utils.coffee
@@ -342,31 +342,31 @@
   levelNumberMap

 module.exports.findNextLevel = (levels, currentIndex, needsPractice) ->
-    # levels = [{practice: true/false, complete: true/false}]
-    index = currentIndex
-    index++
-    if needsPractice
-      if levels[currentIndex].practice or index < levels.length and levels[index].practice
-        # Needs practice, on practice or next practice, choose next incomplete level
-        # May leave earlier practice levels incomplete and reach end of course
-        index++ while index < levels.length and levels[index].complete
-      else
-        # Needs practice, on required, next required, choose first incomplete level of previous practice chain
-        index--
-        index-- while index >= 0 and not levels[index].practice
+  # levels = [{practice: true/false, complete: true/false}]
+  index = currentIndex
+  index++
+  if needsPractice
+    if levels[currentIndex].practice or index < levels.length and levels[index].practice
+      # Needs practice, on practice or next practice, choose next incomplete level
+      # May leave earlier practice levels incomplete and reach end of course
+      index++ while index < levels.length and levels[index].complete
+    else
+      # Needs practice, on required, next required, choose first incomplete level of previous practice chain
+      index--
+      index-- while index >= 0 and not levels[index].practice
+      if index >= 0
+        index-- while index >= 0 and levels[index].practice
         if index >= 0
-          index-- while index >= 0 and levels[index].practice
-          if index >= 0
-            index++
-            index++ while index < levels.length and levels[index].practice and levels[index].complete
-            if levels[index].practice and not levels[index].complete
-              return index
-        index = currentIndex + 1
-        index++ while index < levels.length and levels[index].complete
-    else
-      # No practice needed, next required incomplete level
-      index++ while index < levels.length and (levels[index].practice or levels[index].complete)
-    index
+          index++
+          index++ while index < levels.length and levels[index].practice and levels[index].complete
+          if levels[index].practice and not levels[index].complete
+            return index
+      index = currentIndex + 1
+      index++ while index < levels.length and levels[index].complete
+  else
+    # No practice needed, next required incomplete level
+    index++ while index < levels.length and (levels[index].practice or levels[index].complete)
+  index

 module.exports.needsPractice = (playtime=0, threshold=2) ->
   playtime / 60 > threshold


fetch inbox first

fetch inbox first

--- server/models/store_account_and_boxes.coffee
+++ server/models/store_account_and_boxes.coffee
@@ -152,7 +152,10 @@
     account = exports.getAccount accountID
     for mailbox in exports.getMailboxesByAccount accountID
         out.push mailbox if mailbox.id in account.favorites or []
-    return out
+    return out.sort (a, b) ->
+        if a.label is 'INBOX' then return -1
+        else if b.label is 'INBOX' then return 1
+        else return a.label.localeCompare b.label

 exports.getMailbox = (mailboxID) ->
     mailboxesByID[mailboxID]


Add integration test for moving a file

Add integration test for moving a file

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

--- test/integration/move_file.coffee
+++ test/integration/move_file.coffee
@@ -0,0 +1,112 @@
+faker  = require 'faker'
+find   = require 'lodash.find'
+fs     = require 'fs-extra'
+path   = require 'path'
+should = require 'should'
+
+Cozy  = require '../helpers/integration'
+Files = require '../helpers/files'
+
+
+describe 'Move a file', ->
+    @slow 1000
+    @timeout 10000
+
+    before Cozy.ensurePreConditions
+
+
+    describe 'on local', ->
+        src =
+            path: ''
+            name: faker.name.jobArea()
+        dst =
+            path: ''
+            name: faker.name.jobType()
+        expectedSizes = []
+
+        before Cozy.registerDevice
+        before Files.deleteAll
+        before Cozy.sync
+        after Cozy.clean
+
+        it 'create the local file', ->
+            fixturePath = path.join Cozy.fixturesDir, 'chat-mignon-mod.jpg'
+            filePath = path.join @basePath, src.path, src.name
+            src.size = fs.statSync(fixturePath).size
+            fs.copySync fixturePath, filePath
+
+        it 'waits a bit', (done) ->
+            setTimeout done, 4000
+
+        it 'renames the file', (done) ->
+            srcPath = path.join @basePath, src.path, src.name
+            dstPath = path.join @basePath, dst.path, dst.name
+            fs.rename srcPath, dstPath, done
+
+        it 'waits a bit', (done) ->
+            setTimeout done, 4000
+
+        it 'has the file on local', ->
+            files = fs.readdirSync @basePath
+            files = (f for f in files when f isnt '.cozy-desktop')
+            files.length.should.equal 1
+            size = fs.statSync(path.join @basePath, files[0]).size
+            size.should.equal src.size
+            files[0].should.equal dst.name
+
+        it 'has the file on remote', (done) ->
+            Files.getAllFiles (err, files) ->
+                files.length.should.equal 1
+                files[0].size.should.eql src.size
+                files[0].name.should.equal dst.name
+                done()
+
+
+    describe 'on remote', ->
+        src =
+            path: ''
+            name: faker.name.jobArea()
+            lastModification: '2015-10-13T02:04:08Z'
+        dst =
+            path: ''
+            name: faker.name.jobType()
+        expectedSizes = []
+
+        before Cozy.registerDevice
+        before Files.deleteAll
+        before Cozy.sync
+        after Cozy.clean
+
+        it 'create the remote file', (done) ->
+            fixturePath = path.join Cozy.fixturesDir, 'chat-mignon.jpg'
+            Files.uploadFile src, fixturePath, (err, created) ->
+                src.id = created.id
+                src.size = fs.statSync(fixturePath).size
+                done()
+
+        it 'waits a bit', (done) ->
+            setTimeout done, 4000
+
+        it 'renames the file', (done) ->
+            srcPath = path.join @basePath, src.path, src.name
+            dstPath = path.join @basePath, dst.path, dst.name
+            dst.id = src.id
+            Files.updateFile dst, done
+
+        it 'waits a bit', (done) ->
+            setTimeout done, 4000
+
+        it 'has the file on local', ->
+            files = fs.readdirSync @basePath
+            files = (f for f in files when f isnt '.cozy-desktop')
+            files.length.should.equal 1
+            size = fs.statSync(path.join @basePath, files[0]).size
+            size.should.equal src.size
+            files[0].should.equal dst.name
+
+        it 'has the file on remote', (done) ->
+            Files.getAllFiles (err, files) ->
+                files.length.should.equal 1
+                files[0].size.should.eql src.size
+                files[0].name.should.equal dst.name
+                done()


Cleanup

Cleanup

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


moving config so it loads earlier

moving config so it loads earlier

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

--- app/server/lib/config/accounts.coffee
+++ app/server/lib/config/accounts.coffee
@@ -0,0 +1,14 @@
+
+
+Accounts.onCreateUser (options, user) ->
+    if options.profile
+        user.profile = options.profile
+        if user.profile.name?
+            user.tag = createUserTag(user.profile.name)
+            console.log("New User", user.profile.name, user.tag)
+        else
+            console.log("No profile.name for new user", user)
+    else
+        console.log("No profile for new user", user)
+    user
+


add model for saving pokemon

add model for saving pokemon

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

--- app/models/pokemon.coffee
+++ app/models/pokemon.coffee
@@ -0,0 +1,5 @@
+PokemonModel = DS.Model.extend
+    breed: DS.attr 'string'
+    nickname: DS.attr 'string'
+
+`export default PokemonModel`


QF dropzone

QF dropzone

error: pathspec 'app/assets/javascripts/folio/console/dropzone-init.coffee' did not match any file(s) known to git

--- app/assets/javascripts/folio/console/dropzone-init.coffee
+++ app/assets/javascripts/folio/console/dropzone-init.coffee
@@ -0,0 +1 @@
+Dropzone.autoDiscover = false;


Add Query#delete() method and "delete" event.

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


bug fixes

bug fixes


allow connecting to delete databases when database is full


add grumpy cat dislike

add grumpy cat dislike

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

--- src/scripts/dislike.coffee
+++ src/scripts/dislike.coffee
@@ -0,0 +1,17 @@
+# Description:
+#   Grumpy cat dislike this >:[
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#
+# Author:
+#   nesQuick
+
+module.exports = (robot) ->
+  robot.hear /dislike/i, (msg) ->
+    msg.send "https://pbs.twimg.com/media/BFV2RuQCUAArpAs.jpg"


Remove unused Subscriber mixin

Remove unused Subscriber mixin

--- src/less-compile-cache.coffee
+++ src/less-compile-cache.coffee
@@ -1,13 +1,10 @@
 path = require 'path'
 fs = require 'fs-plus'
 LessCache = require 'less-cache'
-{Subscriber} = require 'emissary'

 # {LessCache} wrapper used by {ThemeManager} to read stylesheets.
 module.exports =
 class LessCompileCache
-  Subscriber.includeInto(this)
-
   @cacheDir: path.join(process.env.ATOM_HOME, 'compile-cache', 'less')

   constructor: ({resourcePath, importPaths}) ->
@@ -35,5 +32,3 @@

   cssForFile: (stylesheetPath, lessContent) ->
     @cache.cssForFile(stylesheetPath, lessContent)
-
-  destroy: -> @unsubscribe()


Added root module

Added root module

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

--- src/core/root.coffee
+++ src/core/root.coffee
@@ -0,0 +1 @@
+do (root = @) -> define 'root', -> root


activity: add TopicChatPane component

activity: add TopicChatPane component

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

--- client/activity/lib/components/topicchatpane/index.coffee
+++ client/activity/lib/components/topicchatpane/index.coffee
@@ -0,0 +1,66 @@
+kd    = require 'kd'
+React = require 'kd-react'
+immutable = require 'immutable'
+
+ChatInputWidget      = require 'activity/components/chatinputwidget'
+ActivityFlux         = require 'activity/flux'
+KDReactorMixin       = require 'app/flux/reactormixin'
+
+ChatList = require 'activity/components/chatlist'
+
+module.exports = class TopicChatPane extends React.Component
+
+  constructor: (props) ->
+
+    super props
+
+    @state = { channel: @props.channel or null, messages: immutable.List() }
+
+
+  getDataBindings: ->
+      messages: ActivityFlux.getters.selectedChannelThreadMessages
+
+
+  componentDidMount: ->
+
+    { thread, message } = ActivityFlux.actions
+
+    thread.changeSelectedThread @state.channel.id
+    message.loadMessages @state.channel.id
+
+
+  channel: (key) -> if key then @state.channel[key] else @state.channel
+
+  onSubmit: ({ value }) ->
+
+    body = value
+    name = @channel 'name'
+
+    unless body.match ///\##{name}///
+      body += " ##{name} "
+
+    ActivityFlux.actions.message.createMessage @channel('id'), body
+
+
+  render: ->
+    messages = @state.messages.sortBy (m) -> m.get 'createdAt'
+

+

+
+
{@channel 'name'}

+

+

+
+

+

+            <ChatList messages={messages} />
+

+

+
+          <ChatInputWidget onSubmit={@bound 'onSubmit'} />
+
+

+

+
+
+React.Component.include.call TopicChatPane, [KDReactorMixin]


AdminModal: Added InvitedItemView class.

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

--- client/admin/lib/views/invitations/inviteditemview.coffee
+++ client/admin/lib/views/invitations/inviteditemview.coffee
@@ -0,0 +1,47 @@
+kd                = require 'kd'
+JView             = require 'app/jview'
+KDButtonView      = kd.ButtonView
+KDTimeAgoView     = kd.TimeAgoView
+KDListItemView    = kd.ListItemView
+KDCustomHTMLView  = kd.CustomHTMLView
+
+
+module.exports = class InvitedItemView extends KDListItemView
+
+  JView.mixin @prototype
+
+  constructor: (options = {}, data) ->
+
+    options.type or= 'member'
+
+    super options, data
+
+    { hash, createdAt } = data
+
+    size             = 40
+    defaultAvatarUri = "https://koding-cdn.s3.amazonaws.com/square-avatars/default.avatar.#{size}.png"
+
+    @avatar      = new KDCustomHTMLView
+      tagName    : 'img'
+      cssClass   : 'avatarview'
+      attributes :
+        src      : "//gravatar.com/avatar/#{hash}?s=#{size}&d=#{defaultAvatarUri}"
+
+    @timeAgoView = new KDTimeAgoView {}, createdAt
+
+
+  pistachio: ->
+
+    { email, firstName, lastName } = @getData()
+    emailMarkup = "#{email}"
+
+    if firstName or lastName
+      markup = "#{emailMarkup} - #{firstName or ''} #{lastName or ''}"
+
+    return """
+

+        {{> @avatar}}
+
#{markup or emailMarkup}

+

+      {{> @timeAgoView}}
+    """


adding console to single box service

adding console to single box service


refactoring: clipTop, clipBottom, adjustPadding, adjustScrollTop

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


bug fix

bug fix


Updated Daemon

Updated Daemon

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


Extend user model with primary role names

[#102495088]

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


Use snapshot hours endpoint from evercam-media server

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


started abstracting functionality out to an OrderedSet container class

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

--- src/orderedset.coffee
+++ src/orderedset.coffee
@@ -0,0 +1,44 @@
+_some = (fn) ->
+    return true for i in this when fn(i)
+
+    false
+
+some = Array::some ? _some
+
+class OrderedSet extends Events
+    constructor: (@equal, @greater) ->
+        @equal   ?= (a, b) -> a is b
+        @greater ?= (a, b) -> b > a
+        @items = []
+
+    add: (items...) ->
+        new_items = []
+        equal   = @equal
+        greater = @greater
+
+        contains = (arr, item) ->
+            some.call arr, (a) -> equal a, item
+
+        is_new = (item) ->
+            !( contains(new_items, item) or contains(@items, item) )
+
+        for item in items when is_new item
+            new_items.push item
+
+        if new_items.length > 0
+            items = @items.concat [new_items]
+
+            items.sort (a, b) ->
+                if greater(b, a) then -1 else 1
+
+            @items = items
+
+            @trigger 'update', this, new_items
+
+    item: (n) -> @items[n]
+
+    take: (n = @items.length - 1) -> @items[..n]
+
+    drop: (n = 0) -> @items[n..]
+
+    slice: (a, b) -> @items[a..b]


fix nonglobal access to umbriel class

fix nonglobal access to umbriel class

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


First draft of Rhodey IpInfo lookup

First draft of Rhodey IpInfo lookup

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

--- src/scripts/rhodey-geo-ipinfo.coffee
+++ src/scripts/rhodey-geo-ipinfo.coffee
@@ -0,0 +1,28 @@
+# Description:
+#   Geolocate an IP using Ipinfo.io through Rhodey
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot geo <ip> - Gets location associated with an IP
+#
+# Author:
+#   Scott J Roberts - @sroberts
+
+RHODEY_IP = process.env.RHODEY_IP
+RHODEY_PORT = process.env.RHODEY_PORT
+
+module.exports = (robot) ->
+  robot.respond /geo (.*)/i, (msg) ->
+    ip = msg.match[1].toLowerCase()
+    robot.http("{RHODEY_IP}:{RHODEY_PORT}" + "/ip/{ip}/geo/ipinfo.json")
+      .get() (err, res, body) ->
+        if res.statusCode is 200
+          ipinfo_json = JSON.parse body
+          msg.send "I'm pretty sure #{ip} is in #{ipinfo_json['city']}, #{ipinfo_json['region']}, #{ipinfo_json['country']}."
+        else
+          msg.send "Error: Couldn't access Rhodey({RHODEY_IP}:{RHODEY_PORT})."


Remove old code

Remove old code

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


db implementation

db implementation

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/call-a3/claimed.git/'


make LaterStream an event emitter to get stream

Sometimes you need the stream object. You can take it only when it's ready.

--- src/utils/later_stream.coffee
+++ src/utils/later_stream.coffee
@@ -3,25 +3,32 @@
     stream.on 'data', (chunk) -> body += chunk if cb
     stream.on 'end', -> cb? body

+
 # Public: former API returned the mikeal/request object from getBinary
 # this is a fake similar object with pipe & abort
-module.exports = class LaterStream
+module.exports = class LaterStream extends EventEmitter
+

     constructor: (@callback) ->
+        super
         @pipeDests = []
         @aborted = false
+        @callbackCalled = false
         @trueStream = null

     _onStreamingDone: (err) =>
         unless @callbackCalled
+            @callbackCalled = true
             @callback err
+

     abort: =>
         if @trueStream
             @trueStream.req.abort()
         else
             @aborted = true
+

     pipe: (dest) =>
         if @trueStream
@@ -32,9 +39,11 @@

     onReadableReady: (error, stream) =>
+
         if error
             drainStream stream
             @_onStreamingDone error
+
         else if stream?.statusCode isnt 200
             drainStream stream, (body) =>
                 error = new Error "Error code #{stream?.statusCode} - #{body}"
@@ -46,8 +55,10 @@
             drainStream stream
         else
             @trueStream = stream
+            @emit 'ready', @trueStream
             @trueStream.on 'error', @_onStreamingDone
             @trueStream.on 'end', @_onStreamingDone
+
             for dest in @pipeDests
                 @pipefilter? @trueStream, dest
-                @trueStream.pipe dest+                @trueStream.pipe dest


fix race conditions some more

fix race conditions some more

--- test/lib/messageIOClient-spec.coffee
+++ test/lib/messageIOClient-spec.coffee
@@ -1,3 +1,4 @@
+async = require 'async'
 config = require '../../config'
 {createClient} = require '../../lib/redis'
 MessageIOClient = require '../../lib/messageIOClient'
@@ -18,16 +19,20 @@

       describe 'when given the same string', ->
         beforeEach (done) ->
+          @sut.once 'message', => done()
           message = devices: ['apple'], topic: 'pears', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)

         it 'emit the message', ->
           expect(@onMessage).to.have.been.calledWith devices: ['apple'], topic: 'pears', payload: 'hi'

       describe 'when given the wrong string', ->
-        beforeEach (done) ->
+        beforeEach ->
           message = devices: ['apple'], topic: 'bears', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)
+
+        beforeEach (done) ->
+          setTimeout done, 100

         it 'should not emit the message', ->
           expect(@onMessage).not.to.have.been.called
@@ -38,32 +43,38 @@

       describe 'when given the same string', ->
         beforeEach (done) ->
+          @sut.once 'message', => done()
           message = devices: ['apple'], topic: 'pear', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)

         it 'should emit the message', ->
           expect(@onMessage).to.have.been.called

       describe 'when given one more character', ->
         beforeEach (done) ->
+          @sut.once 'message', => done()
           message = devices: ['apple'], topic: 'pears', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)

         it 'should emit the message', ->
           expect(@onMessage).to.have.been.called

       describe 'when given a longer string', ->
         beforeEach (done) ->
+          @sut.once 'message', => done()
           message = devices: ['apple'], topic: 'pearson', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)

         it 'should emit the message', ->
           expect(@onMessage).to.have.been.called

       describe 'when given a different string', ->
-        beforeEach (done) ->
+        beforeEach ->
           message = devices: ['apple'], topic: 'paer', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)
+
+        beforeEach (done) ->
+          setTimeout done, 100

         it 'should not emit the message', ->
           expect(@onMessage).not.to.have.been.called
@@ -74,32 +85,38 @@

       describe 'when given the same string', ->
         beforeEach (done) ->
+          @sut.once 'message', => done()
           message = devices: ['apple'], topic: 'pear', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)

         it 'should emit the message', ->
           expect(@onMessage).to.have.been.called

       describe 'when given one more character', ->
         beforeEach (done) ->
+          @sut.once 'message', => done()
           message = devices: ['apple'], topic: 'pears', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)

         it 'should emit the message', ->
           expect(@onMessage).to.have.been.called

       describe 'when given a longer string', ->
         beforeEach (done) ->
+          @sut.once 'message', => done()
           message = devices: ['apple'], topic: 'pearson', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)

         it 'should emit the message', ->
           expect(@onMessage).to.have.been.called

       describe 'when given a different string', ->
-        beforeEach (done) ->
+        beforeEach ->
           message = devices: ['apple'], topic: 'paer', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)
+
+        beforeEach (done) ->
+          setTimeout done, 100

         it 'should not emit the message', ->
           expect(@onMessage).not.to.have.been.called
@@ -110,24 +127,29 @@

       describe 'when given a matching string', ->
         beforeEach (done) ->
+          @sut.once 'message', => done()
           message = devices: ['apple'], topic: 'pear', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)

         it 'should emit the message', ->
           expect(@onMessage).to.have.been.called

       describe 'given another matching string', ->
         beforeEach (done) ->
+          @sut.once 'message', => done()
           message = devices: ['apple'], topic: 'paer', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)

         it 'should emit the message', ->
           expect(@onMessage).to.have.been.called

       describe 'when given a non-matching string', ->
-        beforeEach (done) ->
+        beforeEach ->
           message = devices: ['apple'], topic: 'raer', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)
+
+        beforeEach (done) ->
+          setTimeout done, 100

         it 'should not emit the message', ->
           expect(@onMessage).not.to.have.been.called
@@ -137,17 +159,21 @@
         @sut.subscribe 'apple', ['received'], ['-pears'], done

       describe 'when given a matching string', ->
-        beforeEach (done) ->
+        beforeEach ->
           message = devices: ['apple'], topic: 'pears', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)
+
+        beforeEach (done) ->
+          setTimeout done, 100

         it 'should not emit the message', ->
           expect(@onMessage).not.to.have.been.called

       describe 'when given a non-matching string', ->
         beforeEach (done) ->
+          @sut.once 'message', => done()
           message = devices: ['apple'], topic: 'paer', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)

         it 'should emit the message', ->
           expect(@onMessage).to.have.been.called
@@ -157,25 +183,32 @@
         @sut.subscribe 'apple', ['received'], ['-p*r*'], done

       describe 'when given a matching string', ->
-        beforeEach (done) ->
+        beforeEach ->
           message = devices: ['apple'], topic: 'pears', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)
+
+        beforeEach (done) ->
+          setTimeout done, 100

         it 'should not emit the message', ->
           expect(@onMessage).not.to.have.been.called

       describe 'when given a non-matching string', ->
-        beforeEach (done) ->
+        beforeEach ->
           message = devices: ['apple'], topic: 'paer', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)
+
+        beforeEach (done) ->
+          setTimeout done, 100

         it 'should not emit the message', ->
           expect(@onMessage).not.to.have.been.called

       describe 'when given a non-matching string', ->
         beforeEach (done) ->
+          @sut.once 'message', => done()
           message = devices: ['apple'], topic: 'dear', payload: 'hi'
-          @redis.publish 'test:received:apple', JSON.stringify(message), done
+          @redis.publish 'test:received:apple', JSON.stringify(message)

         it 'should emit the message', ->
           expect(@onMessage).to.have.been.called
@@ -183,88 +216,89 @@
   describe 'subscribe', ->
     describe 'received only', ->
       beforeEach (done) ->
-        @sut.once 'message', (@message) =>
-        @sut.subscribe 'apple', ['received'], undefined, =>
-          @redis.publish 'test:received:apple', JSON.stringify(dehydration: 'WATER you DOING?'), =>
-            done()
+        @sut.subscribe 'apple', ['received'], undefined, done
+
+      beforeEach (done) ->
+        @sut.once 'message', (@message) => done()
+        @redis.publish 'test:received:apple', JSON.stringify(dehydration: 'WATER you DOING?')

       it 'should get a message', ->
         expect(@message).to.deep.equal dehydration: 'WATER you DOING?'

     describe 'sent only', ->
       beforeEach (done) ->
-        @sut.once 'message', (@message) =>
-        @sut.subscribe 'hubris', ['sent'], undefined, =>
-          @redis.publish 'test:sent:hubris', JSON.stringify(that: 'would never happen to me!'), =>
-            done()
+        @sut.subscribe 'hubris', ['sent'], undefined, done
+
+      beforeEach (done) ->
+        @sut.once 'message', (@message) => done()
+        @redis.publish 'test:sent:hubris', JSON.stringify(that: 'would never happen to me!')

       it 'should get a message', ->
         expect(@message).to.deep.equal that: 'would never happen to me!'

     describe 'broadcast only', ->
       beforeEach (done) ->
-        @sut.once 'message', (@message) =>
-        @sut.subscribe 'hubris', ['broadcast'], undefined, =>
-          @redis.publish 'test:broadcast:hubris', JSON.stringify(that: 'would never happen to me!'), =>
-            done()
+        @sut.subscribe 'hubris', ['broadcast'], undefined, done
+
+      beforeEach (done) ->
+        @sut.once 'message', (@message) => done()
+        @redis.publish 'test:broadcast:hubris', JSON.stringify(that: 'would never happen to me!')

       it 'should get a message', ->
         expect(@message).to.deep.equal that: 'would never happen to me!'

     describe 'all kinds', ->
       beforeEach (done) ->
-        @sut.once 'message', (@message) =>
         @sut.subscribe 'heart', ['broadcast', 'sent', 'received'], undefined, done

       describe 'receiving a broadcast message', ->
         beforeEach (done) ->
-          @redis.publish 'test:broadcast:heart', JSON.stringify(couldBe: 'The 80s band'), =>
-            done()
+          @sut.once 'message', (@message) => done()
+          @redis.publish 'test:broadcast:heart', JSON.stringify(couldBe: 'The 80s band')

         it 'should get a broadcast message', ->
           expect(@message).to.deep.equal couldBe: 'The 80s band'

       describe 'receiving a received message', ->
         beforeEach (done) ->
-          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?'), =>
-            done()
+          @sut.once 'message', (@message) => done()
+          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?')

         it 'should get a received message', ->
           expect(@message).to.deep.equal couldBe: 'lovesick?'

       describe 'receiving a received message', ->
         beforeEach (done) ->
-          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?'), =>
-            done()
+          @sut.once 'message', (@message) => done()
+          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?')

         it 'should get a received message', ->
           expect(@message).to.deep.equal couldBe: 'lovesick?'

     describe 'no kinds', ->
       beforeEach (done) ->
-        @sut.once 'message', (@message) =>
         @sut.subscribe 'heart', undefined, undefined, done

       describe 'receiving a broadcast message', ->
         beforeEach (done) ->
-          @redis.publish 'test:broadcast:heart', JSON.stringify(couldBe: 'The 80s band'), =>
-            done()
+          @sut.once 'message', (@message) => done()
+          @redis.publish 'test:broadcast:heart', JSON.stringify(couldBe: 'The 80s band')

         it 'should get a broadcast message', ->
           expect(@message).to.deep.equal couldBe: 'The 80s band'

       describe 'receiving a received message', ->
         beforeEach (done) ->
-          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?'), =>
-            done()
+          @sut.once 'message', (@message) => done()
+          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?')

         it 'should get a received message', ->
           expect(@message).to.deep.equal couldBe: 'lovesick?'

       describe 'receiving a received message', ->
         beforeEach (done) ->
-          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?'), =>
-            done()
+          @sut.once 'message', (@message) => done()
+          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?')

         it 'should get a received message', ->
           expect(@message).to.deep.equal couldBe: 'lovesick?'
@@ -276,8 +310,10 @@
         @sut.once 'message', @onMessage
         @sut.subscribe 'apple', ['received'], undefined, =>
           @sut.unsubscribe 'apple', ['received'], =>
-            @redis.publish 'test:received:apple', JSON.stringify(dehydration: 'WATER you DOING?'), =>
-              done()
+            @redis.publish 'test:received:apple', JSON.stringify(dehydration: 'WATER you DOING?'), done
+
+      beforeEach (done) ->
+        setTimeout done, 100

       it 'should not get a message', ->
         expect(@onMessage).not.to.have.been.called
@@ -288,8 +324,7 @@
         @sut.once 'message', @onMessage
         @sut.subscribe 'hubris', ['sent'], undefined, =>
           @sut.unsubscribe 'hubris', ['sent'], =>
-            @redis.publish 'test:sent:hubris', JSON.stringify(that: 'would never happen to me!'), =>
-              done()
+            @redis.publish 'test:sent:hubris', JSON.stringify(that: 'would never happen to me!'), done

       it 'should not get a message', ->
         expect(@onMessage).not.to.have.been.called
@@ -300,8 +335,10 @@
         @sut.once 'message', @onMessage
         @sut.subscribe 'hubris', ['broadcast'], undefined, =>
           @sut.unsubscribe 'hubris', ['broadcast'], =>
-            @redis.publish 'test:broadcast:hubris', JSON.stringify(that: 'would never happen to me!'), =>
-              done()
+            @redis.publish 'test:broadcast:hubris', JSON.stringify(that: 'would never happen to me!'), done
+
+      beforeEach (done) ->
+        setTimeout done, 100

       it 'should not get a message', ->
         expect(@onMessage).not.to.have.been.called
@@ -315,24 +352,21 @@

       describe 'receiving a broadcast message', ->
         beforeEach (done) ->
-          @redis.publish 'test:broadcast:heart', JSON.stringify(couldBe: 'The 80s band'), =>
-            done()
-
-        it 'should not get any', ->
-          expect(@onMessage).not.to.have.been.called
-
-      describe 'receiving a received message', ->
-        beforeEach (done) ->
-          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?'), =>
-            done()
-
-        it 'should not get any', ->
-          expect(@onMessage).not.to.have.been.called
-
-      describe 'receiving a received message', ->
-        beforeEach (done) ->
-          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?'), =>
-            done()
+          @redis.publish 'test:broadcast:heart', JSON.stringify(couldBe: 'The 80s band'), done
+
+        it 'should not get any', ->
+          expect(@onMessage).not.to.have.been.called
+
+      describe 'receiving a received message', ->
+        beforeEach (done) ->
+          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?'), done
+
+        it 'should not get any', ->
+          expect(@onMessage).not.to.have.been.called
+
+      describe 'receiving a received message', ->
+        beforeEach (done) ->
+          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?'), done

         it 'should not get any', ->
           expect(@onMessage).not.to.have.been.called
@@ -345,25 +379,31 @@
           @sut.unsubscribe 'heart', undefined, done

       describe 'receiving a broadcast message', ->
-        beforeEach (done) ->
-          @redis.publish 'test:broadcast:heart', JSON.stringify(couldBe: 'The 80s band'), =>
-            done()
-
-        it 'should not get any', ->
-          expect(@onMessage).not.to.have.been.called
-
-      describe 'receiving a received message', ->
-        beforeEach (done) ->
-          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?'), =>
-            done()
-
-        it 'should not get any', ->
-          expect(@onMessage).not.to.have.been.called
-
-      describe 'receiving a received message', ->
-        beforeEach (done) ->
-          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?'), =>
-            done()
-
-        it 'should not get any', ->
-          expect(@onMessage).not.to.have.been.called
+        beforeEach ->
+          @redis.publish 'test:broadcast:heart', JSON.stringify(couldBe: 'The 80s band')
+
+        beforeEach (done) ->
+          setTimeout done, 100
+
+        it 'should not get any', ->
+          expect(@onMessage).not.to.have.been.called
+
+      describe 'receiving a received message', ->
+        beforeEach ->
+          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?')
+
+        beforeEach (done) ->
+          setTimeout done, 100
+
+        it 'should not get any', ->
+          expect(@onMessage).not.to.have.been.called
+
+      describe 'receiving a received message', ->
+        beforeEach ->
+          @redis.publish 'test:received:heart', JSON.stringify(couldBe: 'lovesick?')
+
+        beforeEach (done) ->
+          setTimeout done, 100
+
+        it 'should not get any', ->
+          expect(@onMessage).not.to.have.been.called


Update class name in auth.mobile

Update class name in auth.mobile

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


shortcuts: add 'toCollection' convenience method :moyai:

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


rtm: code-style fix

rtm: code-style fix

--- client/ide/lib/realtimemanager.coffee
+++ client/ide/lib/realtimemanager.coffee
@@ -1,7 +1,7 @@
-$ = require 'jquery'
-kd = require 'kd'
-KDObject = kd.Object
-IDEMetrics = require './idemetrics'
+$               = require 'jquery'
+kd              = require 'kd'
+KDObject        = kd.Object
+IDEMetrics      = require './idemetrics'
 GoogleApiClient = require './googleapiclient'

 module.exports = class RealtimeManager extends KDObject
@@ -217,59 +217,86 @@
       # delete key from root map
       model.getRoot().delete key

+
   textInserted: (string, e) ->
-    return  if @isDisposed
+
+    return  if @isDisposed
+
     @emit 'TextInsertedIntoString', string, e

+
   textDeleted: (string, e) ->
-    return  if @isDisposed
+
+    return  if @isDisposed
+
     @emit 'TextDeletedFromString', string, e

+
   bindStringListeners: (string) ->
+
     string.addEventListener gapi.drive.realtime.EventType.TEXT_INSERTED, @binder string, 'inserted', @textInserted
     string.addEventListener gapi.drive.realtime.EventType.TEXT_DELETED, @binder string, 'deleted', @textDeleted

+
   unbindStringListeners: (string) ->
+
     string.removeEventListener gapi.drive.realtime.EventType.TEXT_INSERTED, @binder string, 'inserted', @textInserted
     string.removeEventListener gapi.drive.realtime.EventType.TEXT_DELETED, @binder string, 'deleted', @textDeleted

   mapValueChanged: (map, v) ->
+
     return  if @isDisposed
     @emit 'MapValueChanged', map, v

+
   bindMapListeners: (map) ->
+
     map.addEventListener gapi.drive.realtime.EventType.VALUE_CHANGED, @binder map, 'changed', @mapValueChanged

+
   unbindMapListeners: (map) ->
+
     map.removeEventListener gapi.drive.realtime.EventType.VALUE_CHANGED, @binder map, 'changed', @mapValueChanged

+
   listValueAdded: (list, v) ->
-    return  if @isDisposed
+
+    return  if @isDisposed
+
     @emit 'ValuesAddedToList', list, v

+
   listValueRemoved: (list, v) ->
-    return  if @isDisposed
+
+    return  if @isDisposed
+
     @emit 'ValuesRemovedFromList', list, v

+
   listValueSet: (list, e) ->
-    return  if @isDisposed
+
+    return  if @isDisposed
+
     @emit 'ListValuesSet', list, e

   bindListListeners: (list) ->
+
     list.addEventListener gapi.drive.realtime.EventType.VALUES_ADDED, @binder list, 'added', @listValueAdded
     list.addEventListener gapi.drive.realtime.EventType.VALUES_REMOVED, @binder list, 'removed', @listValueRemoved
     list.addEventListener gapi.drive.realtime.EventType.VALUES_SET, @binder list, 'set', @listValueSet

   unbindListListeners: (list) ->
+
     list.removeEventListener gapi.drive.realtime.EventType.VALUES_ADDED, @binder list, 'added', @listValueAdded
     list.removeEventListener gapi.drive.realtime.EventType.VALUES_REMOVED, @binder list, 'removed', @listValueRemoved
     list.removeEventListener gapi.drive.realtime.EventType.VALUES_SET, @binder list, 'set', @listValueSet

   binder: (collaborativeObj, type, callback) ->
+
     # all kind of collaborativeObjs have id
     throw new Error "id is not set" if not collaborativeObj.id

@@ -279,7 +306,7 @@

   unbindRealtimeListeners: (instance, type) ->

-    return if (index = @collaborativeInstances.indexOf instance) is -1
+    return  if (index = @collaborativeInstances.indexOf instance) is -1

     @collaborativeInstances.splice index, 1

@@ -315,3 +342,4 @@
     @isReady = no

     @emit 'RealtimeManagerDidDispose'
+


new path

new path

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


client/Notification: remove react-flip-move package related codes

--- client/component-lab/Notification/NotificationViewContainer.coffee
+++ client/component-lab/Notification/NotificationViewContainer.coffee
@@ -2,7 +2,6 @@
 ReactView = require 'app/react/reactview'

 NotificationView = require './NotificationView'
-FlipMove = require 'react-flip-move'

 classnames = require 'classnames'
 styles = require './Notification.stylus'
@@ -15,24 +14,6 @@
     options.notifications ?= []
     super options
     @appendToDomBody()  if @getOptions().appendToDomBody
-
-
-  getAnimationProps: ->
-
-    enter :
-      from :
-        transform : 'scale(0.9)'
-        opacity : 0
-      to :
-        transform : ''
-        opacity : ''
-    leave :
-      from :
-        transform : 'scale(1)'
-        opacity : 1
-      to :
-        transform : 'scale(0.9)'
-        opacity : 0

   onNotificationRemove: (uid) =>
@@ -59,8 +40,6 @@

   renderReact: ->

-    { enter, leave } = @getAnimationProps()
-
     stateClass = if @options.notifications.length
     then ''
     else 'hidden'
@@ -71,9 +50,4 @@
     ]

     <div className={className}>
-      <FlipMove
-        enterAnimation={enter}
-        leaveAnimation={leave}>
-        { @getNotifications() }
-      </FlipMove>
     </div>


fixing rollback logic

fixing rollback logic

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


bug fix

bug fix


quick deploy bug fix

quick deploy bug fix


App show popup now :)

App show popup now :)

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


add initial atom config.cson

add initial atom config.cson

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

--- atom.cson
+++ atom.cson
@@ -0,0 +1,13 @@
+welcome:
+  showOnStartup: false
+core:
+  autoHideMenuBar: true
+  projectHome: "/home/walther/git"
+editor:
+  invisibles: {}
+  fontFamily: "DejaVu Sans Mono for Powerline"
+  scrollPastEnd: true
+  showInvisibles: true
+  showIndentGuide: true
+  softWrap: true
+


add social/activity fetching autocomplete list item

error: pathspec 'client/Social/Activity/views/fetchingactivityautocompleteuseritemview.coffee' did not match any file(s) known to git

--- client/Social/Activity/views/fetchingactivityautocompleteuseritemview.coffee
+++ client/Social/Activity/views/fetchingactivityautocompleteuseritemview.coffee
@@ -0,0 +1,5 @@
+class FetchingActivityAutoCompleteUserItemView extends KDAutoCompleteFetchingItem
+
+  constructor: (options, data) ->
+    options.type = 'dropdown-member'
+    super options, data


Added test/ directory. Also put an empty test file.

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


finish the testing with mocks

finish the testing with mocks

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

--- test/mock-test.coffee
+++ test/mock-test.coffee
@@ -0,0 +1,27 @@
+sample = require('../sample')
+assert = require('assert')
+sinon = require('sinon')
+
+describe "calculator", ->
+  before ->
+    @calculator = sinon.spy sample, 'calculator'
+    @mock = sinon.mock(sample)
+    methods = ['multiple', 'addition', 'minus', 'divide']
+    for method in methods
+      @mock.expects(method).once().withArgs([1]).returns({})
+
+  it "should throw an error if no method is matched", ->
+    try
+      sample.calculator('non-exist-method', 1, 2)
+    catch e
+      sinon.assert.threw(@calculator)
+
+  it "should call the given method when parameter is valid", ->
+    methods = ['multiple', 'addition', 'minus', 'divide']
+    for method in methods
+      sample.calculator(method, 1)
+
+  after ->
+    @mock.verify()
+    @mock.restore()
+    @calculator.restore()


Fixed getDocumentForIdOrSlug to be better at recognizing slugs.

--- server/handlers/Handler.coffee
+++ server/handlers/Handler.coffee
@@ -261,11 +261,11 @@

   getDocumentForIdOrSlug: (idOrSlug, done) ->
     idOrSlug = idOrSlug+''
-    try
-      mongoose.Types.ObjectId.createFromHexString(idOrSlug)  # throw error if not a valid ID (probably a slug)
+    isID = idOrSlug.length is 24 and idOrSlug.match(/[a-z0-9]/gi)?.length is 24
+    if isID
       @modelClass.findById(idOrSlug).exec (err, document) ->
         done(err, document)
-    catch e
+    else
       @modelClass.findOne {slug: idOrSlug}, (err, document) ->
         done(err, document)


OrderTotals component

OrderTotals component

error: pathspec 'client/skr/components/OrderTotals.cjsx' did not match any file(s) known to git

--- client/skr/components/OrderTotals.cjsx
+++ client/skr/components/OrderTotals.cjsx
@@ -0,0 +1,14 @@
+class Skr.Components.OrderTotals extends Lanes.React.Component
+
+    propTypes:
+        model: Lanes.PropTypes.Model.isRequired
+
+    render: ->
+        <BS.Row className='order-total'>
+            <BS.Col md=10 className="text-right">
+                Total:
+            </BS.Col>
+            <BS.Col md=2>
+                <Skr.Components.Currency amount={@model.total} />
+            </BS.Col>
+        </BS.Row>


test/helper: add browser switch handler

test/helper: add browser switch handler


handle non-arrays of topics

handle non-arrays of topics

--- lib/messageIOClient.coffee
+++ lib/messageIOClient.coffee
@@ -9,6 +9,7 @@
     @topicMap = {}

   addTopics: (uuid, topics=['*']) =>
+    topics = [topics] unless _.isArray topics
     [skips, names] = _.partition topics, (topic) => _.startsWith topic, '-'
     names = ['*'] if _.isEmpty names
     map = {}


ssl set up

ssl set up

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


Add an experimental resource-bound auto-saving input

error: pathspec 'app/components/resource-input.cjsx' did not match any file(s) known to git

--- app/components/resource-input.cjsx
+++ app/components/resource-input.cjsx
@@ -0,0 +1,79 @@
+React = require 'react'
+ChangeListener = require './change-listener'
+handleInputChange = require '../lib/handle-input-change'
+
+module.exports = React.createClass
+  displayName: 'ResourceInput'
+
+  getDefaultProps: ->
+    type: ''
+    resource: null
+    attribute: ''
+    autoSaveDelay: 5000
+
+  getInitialState: ->
+    edited: false
+    saving: false
+    saved: false
+    error: null
+
+  render: ->
+
+      <ChangeListener target={@props.resource} handler={@renderComponent} />
+
+
+        {if @state.error?
+          {@state.error.message}
+        else if @state.saving
+          Saving...
+        else if @state.edited
+          Edited
+        else if @state.saved
+          Saved}
+
+
+
+  renderComponent: ->
+    component = switch @props.type
+      when 'textarea' then 'textarea'
+      else 'input'
+
+    React.createElement component,
+      type: @props.type
+      className: @props.className
+      name: @props.attribute
+      value: @props.resource[@props.attribute]
+      onChange: @handleChange
+      onBlur: @handleBlur
+
+  handleChange: ->
+    handleInputChange.apply @props.resource, arguments
+
+    clearTimeout @state.saveTimeout
+    @setState
+      edited: true
+      saved: false
+      error: null
+      saveTimeout: setTimeout @saveResource, @props.autoSaveDelay
+
+  handleBlur: ->
+    if @state.edited
+      clearTimeout @state.saveTimeout
+      @saveResource()
+
+  saveResource: ->
+    @setState
+      saving: true
+      saved: false
+      error: null
+
+    @props.resource.save()
+      .catch (error) =>
+        @setState
+          error: error
+      .then =>
+        @setState
+          edited: false
+          saved: true
+      .then =>
+        @setState saving: false


#161 Add VolumeTracingStateLogger

#161 Add VolumeTracingStateLogger

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

--- app/assets/javascripts/oxalis/model/volumetracing_statelogger.coffee
+++ app/assets/javascripts/oxalis/model/volumetracing_statelogger.coffee
@@ -0,0 +1,26 @@
+### define
+./statelogger : StateLogger
+###
+
+class VolumeTracingStateLogger extends StateLogger
+
+
+  constructor : (flycam, version, tracingId, tracingType, allowUpdate, @volumeTracing) ->
+
+    super(flycam, version, tracingId, tracingType, allowUpdate)
+
+    # For now, just save regularily
+    @flycam.on
+      positionChanged : =>
+        @push()
+
+
+  concatUpdateTracing : (array) ->
+
+    return array.concat( {
+      action : "updateTracing"
+      value : {
+        activeCellId : @volumeTracing.getActiveCellId()
+        editPosition : @flycam.getPosition()
+      }
+    })


Fixed datetime snapshot loading

Fixed datetime snapshot loading

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


chore (Grunt) Add uglification to the default build steps

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


is it just this test

is it just this test

--- test/lib/setup.coffee
+++ test/lib/setup.coffee
@@ -1,52 +1,52 @@
-request = require 'superagent'
-express = require 'express'
-{ spawn } = require "child_process"
+# request = require 'superagent'
+# express = require 'express'
+# { spawn } = require "child_process"

-child = null
-gravity = express()
-gravity.get '/foobarbaz', (req, res) -> res.send 'Foobar page!'
-gravity.get '/api/v1/page/:id', (req, res) -> res.send { content: 'foobar' }
-startServer = (callback) ->
-  envVars =
-    ARTSY_URL: "http://localhost:1234"
-    ASSET_PATH: "http://cdn.com/"
-    APP_URL: "http://localhost:3456"
-    PORT: 3456
-  envVars[k] = val for k, val of process.env when not envVars[k]?
-  child = spawn "make", ["s"],
-    customFds: [0, 1, 2]
-    stdio: ["ipc"]
-    env: envVars
-  child.on "message", callback
-  child.stdout.on "data", (data) -> console.log data.toString()
-closeServer = =>
-  child.kill()
-  child = null
+# child = null
+# gravity = express()
+# gravity.get '/foobarbaz', (req, res) -> res.send 'Foobar page!'
+# gravity.get '/api/v1/page/:id', (req, res) -> res.send { content: 'foobar' }
+# startServer = (callback) ->
+#   envVars =
+#     ARTSY_URL: "http://localhost:1234"
+#     ASSET_PATH: "http://cdn.com/"
+#     APP_URL: "http://localhost:3456"
+#     PORT: 3456
+#   envVars[k] = val for k, val of process.env when not envVars[k]?
+#   child = spawn "make", ["s"],
+#     customFds: [0, 1, 2]
+#     stdio: ["ipc"]
+#     env: envVars
+#   child.on "message", callback
+#   child.stdout.on "data", (data) -> console.log data.toString()
+# closeServer = =>
+#   child.kill()
+#   child = null

-describe 'Setup', ->
+# describe 'Setup', ->

-  before (done) ->
-    @server = gravity.listen 1234, ->
-      console.log 'Gravity listening'
-      startServer ->
-        console.log 'Server listening'
-        done()
+#   before (done) ->
+#     @server = gravity.listen 1234, ->
+#       console.log 'Gravity listening'
+#       startServer ->
+#         console.log 'Server listening'
+#         done()

-  after ->
-    @server.close()
-    closeServer()
+#   after ->
+#     @server.close()
+#     closeServer()

-  xit 'proxies unhandled requests to Gravity', (done) ->
-    request.get('http://localhost:3456/foobarbaz').end (res) ->
-      res.text.should.equal 'Foobar page!'
-      done()
+#   xit 'proxies unhandled requests to Gravity', (done) ->
+#     request.get('http://localhost:3456/foobarbaz').end (res) ->
+#       res.text.should.equal 'Foobar page!'
+#       done()

-  it 'changes the asset path if requested from SSL', (done) ->
-    request.get('http://localhost:3456/terms').set('X-Forwarded-Proto': 'https').end (res) ->
-      res.text.should.include 'https://cdn.com/'
-      done()
+#   it 'changes the asset path if requested from SSL', (done) ->
+#     request.get('http://localhost:3456/terms').set('X-Forwarded-Proto': 'https').end (res) ->
+#       res.text.should.include 'https://cdn.com/'
+#       done()

-  it 'returns an ok status when /system/up pinged', (done) ->
-    request.get('http://localhost:3456/system/up').end (res) ->
-      JSON.parse(res.text).nodejs.should.be.ok
-      done()
+#   it 'returns an ok status when /system/up pinged', (done) ->
+#     request.get('http://localhost:3456/system/up').end (res) ->
+#       JSON.parse(res.text).nodejs.should.be.ok
+#       done()


specs for user menu

specs for user menu

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

--- test/user/menu.spec.coffee
+++ test/user/menu.spec.coffee
@@ -0,0 +1,29 @@
+{Testing, expect, sinon, _} = require 'openstax-react-components/test/helpers'
+
+Menu = require 'user/menu'
+User = require 'user/model'
+Course = require 'course/model'
+sandbox = null
+
+describe 'User menu component', ->
+  beforeEach ->
+    @props =
+      course: new Course(ecosystem_book_uuid: 'test-collection-uuid')
+    sandbox = sinon.sandbox.create()
+  afterEach ->
+    sandbox.restore()
+
+  describe 'course options', ->
+
+    beforeEach ->
+      sandbox.stub(User, 'isLoggedIn').returns(true)
+
+    it 'renders for registration when course is not registered', ->
+      sinon.stub(@props.course, 'isRegistered').returns(false)
+      Testing.renderComponent( Menu, props: @props ).then ({dom}) ->
+        expect(dom.textContent).to.match(/Register for Course/)
+
+    it 'renders modification when registered', ->
+      sinon.stub(@props.course, 'isRegistered').returns(true)
+      Testing.renderComponent( Menu, props: @props ).then ({dom}) ->
+        expect(dom.textContent).to.match(/Change Course and ID/)


added mysql.auth_user to exports

added mysql.auth_user to exports

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


Add commmands about weekly duty

Add commmands about weekly duty

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/opengallery/og-bot.git/'


Jarvis on politics

Jarvis on politics

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/dphaener/suburban-jarvis.git/'


Lua is not experimental any more. (But CoffeeScript is.)

--- app/views/play/modal/PlayHeroesModal.coffee
+++ app/views/play/modal/PlayHeroesModal.coffee
@@ -109,9 +109,9 @@
       @codeLanguageList = [
         {id: 'python', name: "Python (#{$.i18n.t('choose_hero.default')})"}
         {id: 'javascript', name: 'JavaScript'}
-        {id: 'coffeescript', name: 'CoffeeScript'}
+        {id: 'coffeescript', name: 'CoffeeScript (#{$.i18n.t('choose_hero.experimental')})'}
         {id: 'clojure', name: "Clojure (#{$.i18n.t('choose_hero.experimental')})"}
-        {id: 'lua', name: "Lua (#{$.i18n.t('choose_hero.experimental')})"}
+        {id: 'lua', name: "Lua"}
         {id: 'io', name: "Io (#{$.i18n.t('choose_hero.experimental')})"}
       ]


do not reinstall window listener if settings change

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


Add "idleTimeout" parameter for Sauce Labs and CI testing.

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


Catch destroy event in some directives

Catch destroy event in some directives

--- app/coffee/modules/kanban/main.coffee
+++ app/coffee/modules/kanban/main.coffee
@@ -257,12 +257,15 @@

 KanbanDirective = ($repo, $rootscope) ->
     link = ($scope, $el, $attrs) ->
-
         tableBodyDom = $el.find(".kanban-table-body")
+
         tableBodyDom.on "scroll", (event) ->
             target = angular.element(event.currentTarget)
             tableHeaderDom = $el.find(".kanban-table-header .kanban-table-inner")
             tableHeaderDom.css("left", -1 * target.scrollLeft())
+
+        $scope.$on "$destroy", ->
+            $el.off()

     return {link: link}

@@ -280,9 +283,13 @@
             size = (statuses.length * itemSize) - 10
             $el.css("width", "#{size}px")

+        $scope.$on "$destroy", ->
+            $el.off()
+
     return {link: link}

 module.directive("tgKanbanRowWidthFixer", KanbanRowWidthFixerDirective)
+

 #############################################################################
 ## Kanban Column Height Fixer Directive
@@ -301,6 +308,9 @@
     link = ($scope, $el, $attrs) ->
         timeout(500, -> renderSize($el))

+        $scope.$on "$destroy", ->
+            $el.off()
+
     return {link:link}

@@ -312,21 +322,25 @@

 KanbanUserstoryDirective = ($rootscope) ->
     link = ($scope, $el, $attrs, $model) ->
+        $el.disableSelection()
+
         $el.find(".icon-edit").on "click", (event) ->
             if $el.find(".icon-edit").hasClass("noclick")
                 return
+
             $scope.$apply ->
                 $rootscope.$broadcast("usform:edit", $model.$modelValue)
         if $scope.us.is_blocked
             $el.addClass("blocked")
-        $el.disableSelection()
+
+        $scope.$on "$destroy", ->
+            $el.off()

     return {
         templateUrl: "/partials/views/components/kanban-task.html"
         link: link
         require: "ngModel"
     }
-

 module.directive("tgKanbanUserstory", ["$rootScope", KanbanUserstoryDirective])

@@ -350,6 +364,9 @@
         $scope.$on "kanban:us:move", redrawWipLimit
         $scope.$on "usform:new:success", redrawWipLimit
         $scope.$on "usform:bulk:success", redrawWipLimit
+
+        $scope.$on "$destroy", ->
+            $el.off()

     return {link: link}

@@ -412,7 +429,9 @@
                     $ctrl = $el.controller()
                     $ctrl.changeUsAssignedTo(us)

+        $scope.$on "$destroy", ->
+            $el.off()
+
     return {link: link, require:"ngModel"}

-
 module.directive("tgKanbanUserAvatar", ["$log", KanbanUserDirective])


Escape hatch redirect

Escape hatch redirect

--- components/page_modal/view.coffee
+++ components/page_modal/view.coffee
@@ -11,7 +11,15 @@

   postRender: ->
     @isLoading()
-    @$('iframe').load =>
+
+    @alreadySetup = false
+
+    @$('iframe').load (e) =>
+      if @alreadySetup
+        # Safety net incase this loads more than once
+        return window.location.href = @contents()[0].location.href
+
+      @alreadySetup = true
       @retargetLinks()
       @isLoaded()


determine if dragged tab was perviously active before reactivating in new pane

--- src/packages/tabs/lib/tab-view.coffee
+++ src/packages/tabs/lib/tab-view.coffee
@@ -82,9 +82,9 @@
     currentDraggedTabIndex = draggedTab.index()
     toEditor.editSessions.splice(currentDraggedTabIndex, 0, fromEditor.editSessions.splice(previousDraggedTabIndex, 1)[0])

+    if fromPaneIndex != toPaneIndex && draggedTab.hasClass('active')
+      fromEditor.setActiveEditSessionIndex(0)
+
     @setActiveTab(currentDraggedTabIndex)
     toEditor.setActiveEditSessionIndex(currentDraggedTabIndex)
     toEditor.focus()
-
-    if fromPaneIndex != toPaneIndex && !draggedTab.hasClass('active')
-      fromEditor.setActiveEditSessionIndex(0)


Add specs

Add specs

--- spec/tree-view-spec.coffee
+++ spec/tree-view-spec.coffee
@@ -3,7 +3,7 @@
 fs = require 'fs-plus'
 TreeView = require '../lib/tree-view'
 path = require 'path'
-temp = require 'temp'
+temp = require('temp').track()
 wrench = require 'wrench'
 os = require 'os'

@@ -38,6 +38,9 @@
       sampleTxt = treeView.find('.file:contains(tree-view.txt)')

       expect(treeView.root.directory.getSubscriptionCount()).toBeGreaterThan 0
+
+  afterEach ->
+    temp.cleanup()

   describe ".initialize(project)", ->
     it "renders the root of the project and its contents alphabetically with subdirectories first in a collapsed state", ->
@@ -1458,11 +1461,12 @@

         describe "when the path is changed and confirmed", ->
           describe "when all the directories along the new path exist", ->
-            it "duplicates the file, updates the tree view, and closes the dialog", ->
+            it "duplicates the file, updates the tree view, opens the new file and closes the dialog", ->
               newPath = path.join(rootDirPath, 'duplicated-test-file.txt')
               copyDialog.miniEditor.setText(newPath)

-              copyDialog.trigger 'core:confirm'
+              waitsForFileToOpen ->
+                copyDialog.trigger 'core:confirm'

               waitsFor "tree view to update", ->
                 treeView.root.find('> .entries > .file:contains(duplicated-test-file.txt)').length > 0
@@ -1475,13 +1479,15 @@
                 dirView = treeView.root.entries.find('.directory:contains(test-dir)').view()
                 dirView.expand()
                 expect(dirView.entries.children().length).toBe 1
+                expect(atom.workspace.getActiveEditor().getPath()).toBe(newPath)

           describe "when the directories along the new path don't exist", ->
-            it "duplicates the tree", ->
+            it "duplicates the tree and opens the new file", ->
               newPath = path.join(rootDirPath, 'new/directory', 'duplicated-test-file.txt')
               copyDialog.miniEditor.setText(newPath)

-              copyDialog.trigger 'core:confirm'
+              waitsForFileToOpen ->
+                copyDialog.trigger 'core:confirm'

               waitsFor "tree view to update", ->
                 treeView.root.find('> .entries > .directory:contains(new)').length > 0
@@ -1490,6 +1496,7 @@

               runs ->
                 expect(fs.existsSync(filePath)).toBeTruthy()
+                expect(atom.workspace.getActiveEditor().getPath()).toBe(newPath)

           describe "when a file or directory already exists at the target path", ->
             it "shows an error message and does not close the dialog", ->


Add a check for the response code to all Jira API calls.

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


Updates comments in the main script.

Updates comments in the main script.


do not overload the UI when many events are created remotely

When new events are created remotely, put new event process in a queue
that deals with each event one by one with a short cooldown between them.

--- client/app/lib/socket_listener.coffee
+++ client/app/lib/socket_listener.coffee
@@ -1,16 +1,63 @@
+
+addModel = (model, callback) =>
+    model.fetch
+        success: (fetched) =>
+            if model.collections?
+                for collection in model.collections
+                    if model instanceof collection.model
+                        collection.add model
+            setTimeout callback, 50
+        error: ->
+            setTimeout callback, 50
+
+
 class SocketListener extends CozySocketListener

     models:
         'event': require 'models/event'

     events: [
-        'event.create','event.update', 'event.delete'
+        'event.create', 'event.update', 'event.delete'
     ]

-    onRemoteCreate: (model) ->
-        for collection in @collections
-            if model instanceof collection.model
-                collection.add model
+    queue: async.queue addModel, 1
+
+
+    process: (event) ->
+        {doctype, operation, id} = event
+        switch operation
+            when 'create'
+                @onRemoteCreate doctype, id
+
+            when 'update'
+                if model = @singlemodels.get id
+                    model.fetch
+                        success: (fetched) =>
+                            if fetched.changedAttributes()
+                                @onRemoteUpdate fetched, null
+
+                @collections.forEach (collection) =>
+                    return unless model = collection.get id
+                    model.fetch
+                        success: (fetched) =>
+                            if fetched.changedAttributes()
+                                @onRemoteUpdate fetched, collection
+
+            when 'delete'
+                if model = @singlemodels.get id
+                    @onRemoteDelete model, @singlemodels
+
+                @collections.forEach (collection) =>
+                    return unless model = collection.get id
+                    @onRemoteDelete model, collection
+
+
+    onRemoteCreate: (docType, id) ->
+        return unless @shouldFetchCreated(id)
+        model = new @models[docType](id: id)
+        model.collections = @collections
+        @queue.push model
+

     onRemoteDelete: (model) ->
         model.trigger 'destroy', model, model.collection, {}


payment: add single plan view.

payment: add single plan view.

error: pathspec 'client/Pricing/views/singleplan.coffee' did not match any file(s) known to git

--- client/Pricing/views/singleplan.coffee
+++ client/Pricing/views/singleplan.coffee
@@ -0,0 +1,42 @@
+class SinglePlanView extends KDView
+
+  constructor: (options = {}, data) ->
+
+    options.cssClass = KD.utils.curry 'single-plan', options.cssClass
+
+    super options, data
+
+
+  viewAppended : ->
+
+    {title, cssClass, planFeatures, price, description} = @getOptions()
+
+    price = price / 100
+
+    @addSubView new KDHeaderView
+      type     : 'medium'
+      cssClass : 'plan-title'
+      title    : "<cite>#{price}</cite>MONTHLY"
+
+    @addSubView new KDCustomHTMLView
+      tagName  : 'p'
+      cssClass : 'plan-summary'
+      partial  : description
+
+    @addSubView featuresContainer = new KDView
+      tagName  : 'dl'
+      cssClass : 'plan-features'
+
+    for feature in planFeatures
+      { cssClass, partial } = feature
+      featuresContainer.addSubView new KDView
+        cssClass : cssClass
+        tagName  : 'dd'
+        partial  : partial
+
+    @addSubView new KDButtonView
+      style     : 'plan-buy-button'
+      title     : 'SELECT'
+      callback  : => @emit 'PlanSelected', title, price
+
+


Allow passing an htmlElement into requireStylesheet

--- src/theme-manager.coffee
+++ src/theme-manager.coffee
@@ -112,8 +112,8 @@
       @requireStylesheet(nativeStylesheetPath)

   # Internal-only:
-  stylesheetElementForId: (id) ->
-    $("""head style[id="#{id}"]""")
+  stylesheetElementForId: (id, htmlElement) ->
+    htmlElement.find("""head style[id="#{id}"]""")

   # Internal-only:
   resolveStylesheet: (stylesheetPath) ->
@@ -128,10 +128,10 @@
   #   LESS file in the stylesheets path.
   #
   # Returns the absolute path to the stylesheet
-  requireStylesheet: (stylesheetPath) ->
+  requireStylesheet: (stylesheetPath, ttype = 'bundled', htmlElement) ->
     if fullPath = @resolveStylesheet(stylesheetPath)
       content = @loadStylesheet(fullPath)
-      @applyStylesheet(fullPath, content)
+      @applyStylesheet(fullPath, content, ttype = 'bundled', htmlElement)
     else
       throw new Error("Could not find a file at path '#{stylesheetPath}'")

@@ -170,12 +170,12 @@
     @stylesheetElementForId(@stringToId(fullPath)).remove()

   # Internal-only:
-  applyStylesheet: (path, text, ttype = 'bundled') ->
-    styleElement = @stylesheetElementForId(@stringToId(path))
+  applyStylesheet: (path, text, ttype = 'bundled', htmlElement=$('html')) ->
+    styleElement = @stylesheetElementForId(@stringToId(path), htmlElement)
     if styleElement.length
       styleElement.text(text)
     else
-      if $("head style.#{ttype}").length
-        $("head style.#{ttype}:last").after "<style class='#{ttype}' id='#{@stringToId(path)}'>#{text}</style>"
+      if htmlElement.find("head style.#{ttype}").length
+        htmlElement.find("head style.#{ttype}:last").after "<style class='#{ttype}' id='#{@stringToId(path)}'>#{text}</style>"
       else
-        $("head").append "<style class='#{ttype}' id='#{@stringToId(path)}'>#{text}</style>"
+        htmlElement.find("head").append "<style class='#{ttype}' id='#{@stringToId(path)}'>#{text}</style>"


Bug fixes for CampaignView achievement checker

--- app/views/play/CampaignView.coffee
+++ app/views/play/CampaignView.coffee
@@ -891,6 +891,7 @@
     true

   checkForUnearnedAchievements: ->
+    return unless @campaign

     # Another layer attempting to make sure users unlock levels properly.

@@ -903,7 +904,7 @@
     achievements = new Achievements()

     achievements.fetchForCampaign(
-      this.campaign.get('slug'),
+      @campaign.get('slug'),
       { data: { project: 'related,rewards,name' } })

     .done((achievements) =>
@@ -917,7 +918,7 @@

       campaignLevels = @campaign.get('levels')

-      levelsEarned = _(me.get('earned').levels)
+      levelsEarned = _(me.get('earned')?.levels)
         .filter (levelOriginal) => campaignLevels[levelOriginal]
         .map (levelOriginal) => campaignLevels[levelOriginal].slug
         .filter()


Troubleshoot: failed and finish events are combined as healthCheckCompleted

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


TestPath for environments

TestPath for environments

--- client/app/MainApp/sidebar/sidebarview.coffee
+++ client/app/MainApp/sidebar/sidebarview.coffee
@@ -127,6 +127,7 @@
       iconOnly  : yes
       iconClass : "cog"
       cssClass  : "clean-gray open-environment"
+      testPath  : "environments-open"
       callback  :->
         if KD.whoami().type is 'unregistered'
           new KDNotificationView title: "This feature requires registration"


Collaboration: Remove machine and quit IDE when user left session