Mock cordova.file too

Mock cordova.file too

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


changed default device to /dev/i2c-1

changed default device to /dev/i2c-1

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/Qasemt/node-i2c.git/'


Better check for iOS

Better check for iOS

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/craftedlabs/rubyconfuruguay-mobile.git/'


likebutton added for admins to vote for users.

--- client/Social/Members/ContentDisplays/profileview.coffee
+++ client/Social/Members/ContentDisplays/profileview.coffee
@@ -502,18 +502,21 @@
       @badgeItemsList = new UserPropertyList {}, counts : @memberData.counts
       # show "Thank You" button to admins
       @thankButton = new KDButtonView
-        title      : "Thank"
+        title      : "+1 rep"
         type       : "submit"
         callback   : =>
-          KD.whoami().likeUser @memberData._id, (err)=>
-            log err if err
-
-
+          KD.whoami().likeMember @memberData.profile.nickname, (err)=>
+            if err
+              warn err
+            else
+              KD.getSingleton("badgeController").checkBadge
+                source : "JAccount" ,property : "staffLikes", relType : "like", targetSelf : 1
+              @thankButton.disable()
+              @utils.wait 3000, =>
+                @thankButton.enable()

   viewAppended:->
-
     super
-
     @createExternalProfiles()
     @createBadges()


add rackspace.test.coffee

add rackspace.test.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/andrewjcasal/koding.git/'


SoftlayerProvider: tests for generic methods


Uses promises and backfills artwork

Uses promises and backfills artwork

--- apps/notifications/client/recently_added_works.coffee
+++ apps/notifications/client/recently_added_works.coffee
@@ -1,6 +1,8 @@
 _ = require 'underscore'
 qs = require 'querystring'
 Backbone = require 'backbone'
+Q = require 'q'
+{ API_URL } = require('sharify').data
 Notifications = require '../../../collections/notifications.coffee'
 Artworks = require '../../../collections/artworks.coffee'
 Artist = require '../../../models/artist.coffee'
@@ -12,11 +14,12 @@
 module.exports = class RecentlyAddedWorksView extends Backbone.View
   columnViews: []

-  initialize: ({@notifications, @filterState}) ->
+  initialize: ({@notifications, @filterState, @following}) ->

     @$feed = @$('#notifications-feed')
     @$pins = @$('#notifications-pins')

+    @backfilledArtworks = new Backbone.Collection []
     @listenTo @notifications, 'sync', @appendArtworks
     @filterState.on 'change', @render

@@ -103,11 +106,27 @@

   checkIfEmpty: =>
     if @isEmpty()
-      @fillBacklogArtists =>
-        @filterState.set(empty:true) if @isEmpty()
+      @backfillWorks =>
+        @filterState.set(empty:true) if isEmpty()

-  fillBacklogArtists: (cb) =>
-    cb()
+  backfillWorks: (cb) =>
+    Q.all(
+      @following.models.map (follow) =>
+        new Artist(id: follow.get('artist').id).fetch()
+    ).then (artists) =>
+      Q.all(
+        artists.map (artist) =>
+          new Artist(artist).related().artworks.fetch
+              url: "#{API_URL}/api/v1/artist/#{artist.id}/artworks"
+              data:
+                for_sale: @filterState.get('forSale')
+                sort: '-published_at'
+                size: 10
+                published: true
+      ).then (artworks) =>
+        @notifications.add _.sortBy(_.flatten(artworks, true), (a) -> a.published_at )
+        @appendArtworks()
+        cb()

   attachScrollHandler: ->
     @$feed.waypoint (direction) =>


Sorting addable Thangs in a sensible order.

--- app/views/editor/level/thangs/AddThangsView.coffee
+++ app/views/editor/level/thangs/AddThangsView.coffee
@@ -33,7 +33,7 @@
       models = @supermodel.getModels(ThangType)

     thangTypes = _.uniq models, false, (thangType) -> thangType.get('original')
-    thangTypes = _.reject thangTypes, (thangType) -> thangType.get('kind') is 'Mark'
+    thangTypes = _.reject thangTypes, (thangType) -> thangType.get('kind') in ['Mark', 'Item']
     groupMap = {}
     for thangType in thangTypes
       kind = thangType.get('kind')
@@ -48,6 +48,10 @@
         name: groupName
         thangs: someThangTypes
       groups.push group
+
+    groups = _.sortBy groups, (group) ->
+      index = ['Wall', 'Floor', 'Unit', 'Doodad', 'Misc'].indexOf group.name
+      if index is -1 then 9001 else index

     context.thangTypes = thangTypes
     context.groups = groups


coffeescript - add some useful command line conveniences

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

--- src/c.coffee
+++ src/c.coffee
@@ -0,0 +1,34 @@
+###
+Some convenient command-line shortcuts.  If you're working on the command line, do
+
+    require('./c.coffee')
+
+The functiosns below in some cases return things, and in some cases set global variables!  Read docs.
+
+###
+
+
+# get a connection to the db
+global.database = ->
+    return global.db = require('./smc-hub/rethink').rethinkdb(hosts:['db0'], pool:1)
+console.log("database() -- sets global variable db to a database")
+
+# make the global variable s be the compute server
+global.compute_server = () ->
+    return require('smc-hub/compute-client').compute_server
+        db_hosts:['db0']
+        cb:(e,s)->
+            global.s=s
+console.log("compute_server() -- sets global variable s to compute server")
+
+# make the global variable p be the project with given id and the global variable s be the compute server
+global.project = (id) ->
+    require('smc-hub/compute-client').compute_server
+        db_hosts:['db0']
+        cb:(e,s)->
+            global.s=s
+            s.project
+                project_id:id
+                cb:(e,p)->global.p=p
+
+console.log("project('project_id') -- set p = project, s = compute server")


Client: Activity: Tests: Added ChannelInfoContainer tests


add gulp/

add gulp/

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

--- gulp/js.coffee
+++ gulp/js.coffee
@@ -0,0 +1,20 @@
+gulp  = require 'gulp'
+del   = require 'del'
+$     = require('gulp-load-plugins')()
+
+paths = gulp.paths
+
+gulp.task 'js', ->
+  del [paths.dist + '/js/*']
+
+  gulp.src paths.src + '/**/*.coffee'
+  .pipe $.plumber()
+  .pipe $.concat('busca-cep.js')
+  .pipe $.coffee(bare: no)
+  .pipe gulp.dest(paths.dist + '/js')
+
+  gulp.src paths.src + '/**/*.coffee'
+  .pipe $.plumber()
+  .pipe $.concat('busca-cep.min.js')
+  .pipe $.uglify()
+  .pipe gulp.dest(paths.dist + '/js')


Added event aggregator Augury.vent

Added event aggregator Augury.vent

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

--- app/assets/javascripts/admin/extensions/event_aggregator.coffee
+++ app/assets/javascripts/admin/extensions/event_aggregator.coffee
@@ -0,0 +1,2 @@
+Augury.vent = _.extend {}, Backbone.Events
+


Passes TextMateBundle spec

Passes TextMateBundle spec

--- src/app/text-mate-bundle.coffee
+++ src/app/text-mate-bundle.coffee
@@ -29,8 +29,8 @@
     extension = fs.extension(fileName)[1...]
     @grammarsByFileType[extension] or @grammarsByFileType["txt"]

-  @getPreferenceForScopeSelector: (name, scopeSelector) ->
-    @preferencesByScopeSelector[scopeSelector][name]
+  @getPreferenceInScope: (scopeSelector, preferenceName) ->
+    @preferencesByScopeSelector[scopeSelector][preferenceName]

   grammars: null

@@ -49,7 +49,6 @@
         { scope, settings } = data[0]

         preferencesByScopeSelector[scope] = _.extend(preferencesByScopeSelector[scope] ? {}, settings)
-        console.log preferencesByScopeSelector

     preferencesByScopeSelector


Add Screech (#19)

Add Screech (#19)

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

--- scripts/screech.coffee
+++ scripts/screech.coffee
@@ -0,0 +1,25 @@
+# Description:
+#   Screech is the most important thing in life.
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot screech - Receive a screech
+
+module.exports = (robot) ->
+  screeches = [
+    'https://imgur.com/H9HgG0t.jpg',
+    'https://imgur.com/5rMknuM.jpg',
+    'https://imgur.com/DC8gDBu.jpg',
+    'https://imgur.com/yfEw7GQ.jpg',
+    'https://imgur.com/ZKCEgpr.jpg',
+    'https://imgur.com/CtduXH5.jpg',
+    'https://imgur.com/FAiK4Vs.jpg'
+  ]
+
+  robot.respond /screech/i, (msg) ->
+    msg.send screeches[Math.floor(Math.random()*screeches.length)]


Forgot the email verification wiring.

Forgot the email verification wiring.

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


Admin: Logs: LogsListController

Admin: Logs: LogsListController


WIP: Support hierarchical aggregation #1

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

--- test/hierarchical-aggregate.coffee
+++ test/hierarchical-aggregate.coffee
@@ -0,0 +1,37 @@
+MultiRun = require '../lib/commands/multi-run'
+var Dockerfile = require '../lib/dockerfile'
+
+class PrintWords
+  @aggregator: () -> MultiRun.aggregator()
+  getWords: (arg) ->
+    if arg instanceof PrintWord
+      arg.word
+    else
+      arg.words.join(' ')
+  constructor: (args...) ->
+    @run = 'echo "' + (@getWords(arg) for arg in args).join(' ') + '"'
+  overrides: () -> false
+
+class Aggregator
+  aggregator: () -> PrintWords.aggregator()
+  equals: (what) -> what instanceof PrintWord or what instanceof PrintWords
+  aggregate: (args...) -> new PrintWords(args...)
+
+class PrintWord
+  @aggregator: () -> new Aggregator()
+  constructor: (@word) ->
+  overrides: () -> false
+
+describe 'Aggregate', () ->
+  it 'multiple levels', () ->
+    dockerfile = new Dockerfile()
+    dockerfile.add(new PrintWord('first'))
+    dockerfile.add(new PrintWord('second'))
+    dockerfile.add(new PrintWord('third'))
+    dockerfile.add(new PrintWord('fourth'))
+    dockerfile.add(new PrintWord('fifth'))
+    lines = []
+    dockerfile.build(lines)
+    should(lines[0]).be.equal('echo "first second third fourth fifth"')
+  });
+});


Assume that home folder is recent folder if its not provided before


No it only

No it only

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


kite db

kite db

--- node_modules_koding/kite-amqp/lib/kite-amqp/index.coffee
+++ node_modules_koding/kite-amqp/lib/kite-amqp/index.coffee
@@ -27,8 +27,10 @@
         if cb
           cb false, true

-      'kite.consume': (opts, cb)->
+      'kite.consume': (opts, cb)=>
         @mergenData.lpop @getChannelNameForGenericName(), (err, val)=>
+          if not val
+            return
           console.log ">>>>>", err, val
           try
             val = JSON.parse val
@@ -36,7 +38,7 @@
             console.log "couldnt parse json"
             return
           console.log "!!!!!!!!!!!!! lpop lpop >>>>>>", val
-          @receivedCommand val.from, null, val.cmd, val.args
+          @receivedCommand val.from, val.id, val.cmd, val.args

   getChannelNameForKite:(genericName, uniqueName)->
     gn = genericName or @serviceGenericName
@@ -92,7 +94,7 @@
     datastr = JSON.stringify(data)
     @mergenData.rpush "#{@getChannelNameForGenericName()}", datastr, ()=>
       console.log "pushed to ", @getChannelNameForGenericName(), datastr
-      @sendCommand @getChannelNameForGenericName(), "kite.consume", datastr
+      #@sendCommand @getChannelNameForGenericName(), "kite.consume", datastr

   sendCommand: (channel, cmd, args, cb=false)->
     # this broadcasts command to the said channel
@@ -153,12 +155,19 @@
       # @queueCommand "hello", ["world"], (ret)->
       #   console.log "queue command returned"

+    startQueueChecker = ()=>
+      setInterval ()=>
+        @commands['kite.consume']()
+      , 10
+
     subscribeCheck = setInterval ()=>
       if subscribeToChannelNames.length is 0
-        clearTimeout subscribeCheck
+        clearInterval subscribeCheck
+        startQueueChecker()
         cb()
     , 10
     @connected = true
+

 module.exports = class Kite extends EventEmitter
   {parse, stringify} = JSON
@@ -189,6 +198,7 @@

   queue: (cmd, args, callback)->
     @communicator.queueCommand cmd, args, callback
+

   constructor:(@kiteName, @api, @publicKey)->
     if not @publicKey
@@ -400,6 +410,7 @@
       checkrabbit = setInterval ()=>
         if rabbitReady
           clearInterval checkrabbit
+          @db = @communicator.mergenData
           @emit 'kite-ready'
       , 10


Make notes JS require its dependencies

Make notes JS require its dependencies

--- app/assets/javascripts/notes.js.coffee
+++ app/assets/javascripts/notes.js.coffee
@@ -1,3 +1,11 @@
+#= require autosave
+#= require bootstrap
+#= require dropzone
+#= require dropzone_input
+#= require gfm_auto_complete
+#= require jquery.atwho
+#= require task_list
+
 class @Notes
   @interval: null

@@ -487,12 +495,12 @@
       form.find('.js-note-target-reopen').text('Reopen')
       form.find('.js-note-target-close').text('Close')

-  enableTaskList: ->
-    $('.note .js-task-list-container').taskList('enable')
-
   initTaskList: ->
     @enableTaskList()
     $(document).on 'tasklist:changed', '.note .js-task-list-container', @updateTaskList

+  enableTaskList: ->
+    $('.note .js-task-list-container').taskList('enable')
+
   updateTaskList: ->
     $('form', this).submit()


Restricted Arcane Ally and Munchkin Harvest to warriors, since otherwise players will tend to suicidally pick their under-armored new ranger or wizard.

--- app/lib/LevelOptions.coffee
+++ app/lib/LevelOptions.coffee
@@ -249,6 +249,7 @@
   'munchkin-harvest':
     requiredGear: {waist: 'leather-belt', 'programming-book': 'programmaticon-ii', eyes: 'wooden-glasses', 'right-hand': 'long-sword', 'left-hand': 'bronze-shield', wrists: 'sundial-wristwatch'}
     restrictedGear: {'programming-book': 'programmaticon-i'}
+    allowedHeroes: ['captain', 'knight', 'samurai']
   'swift-dagger':
     requiredGear: {waist: 'leather-belt', 'programming-book': 'programmaticon-ii', eyes: 'wooden-glasses', 'right-hand': 'crude-crossbow', 'left-hand': 'crude-dagger', wrists: 'sundial-wristwatch'}
     restrictedGear: {eyes: 'crude-glasses', 'programming-book': 'programmaticon-i'}
@@ -262,6 +263,7 @@
   'arcane-ally':
     requiredGear: {waist: 'leather-belt', 'programming-book': 'programmaticon-ii', eyes: 'wooden-glasses', 'right-hand': 'long-sword', 'left-hand': 'bronze-shield', wrists: 'sundial-wristwatch'}
     restrictedGear: {eyes: 'crude-glasses', 'programming-book': 'programmaticon-i'}
+    allowedHeroes: ['captain', 'knight', 'samurai']
   'touch-of-death':
     requiredGear: {waist: 'leather-belt', 'programming-book': 'programmaticon-ii', eyes: 'wooden-glasses', 'right-hand': 'enchanted-stick', 'left-hand': 'unholy-tome-i', wrists: 'sundial-wristwatch'}
     restrictedGear: {'programming-book': 'programmaticon-i'}


clio-26902 Fix default sort

clio-26902 Fix default sort

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


add wr-tableau to components, set hasUI to true for wr-db

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


disconnect pusher after timeout

disconnect pusher after timeout

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/prognostikos/uploadcare-widget.git/'


Create controller for tags new

Create controller for tags new

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

--- app/assets/javascripts/controllers/tags/new.coffee
+++ app/assets/javascripts/controllers/tags/new.coffee
@@ -0,0 +1,6 @@
+Dashboard.TagsNewController = Ember.ObjectController.extend
+  actions:
+    save: ->
+      @get('model').save()
+        .then =>
+          @transitionToRoute 'tags'


query for is_for_sale so we can evaluate correctly

--- src/mobile/apps/artwork/components/related_artworks/queries/index.coffee
+++ src/mobile/apps/artwork/components/related_artworks/queries/index.coffee
@@ -33,4 +33,5 @@
     type
   }
   is_buy_nowable
+  is_for_sale
 """


Using pushState instead of messing with the location hash, derp

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


Make IndexeDB version an integer

Make IndexeDB version an integer

--- assets/javascripts/app/db.coffee
+++ assets/javascripts/app/db.coffee
@@ -262,4 +262,4 @@
       false

   indexedDBVersion: ->
-    if app.config.env is 'production' then app.config.version else Date.now() / 1000
+    if app.config.env is 'production' then parseInt(app.config.version, 10) else Date.now() / 1000


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


Sync Atom snippets from Windows

Sync Atom snippets from Windows

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

--- atom.symlink/snippets.cson
+++ atom.symlink/snippets.cson
@@ -0,0 +1,44 @@
+# Your snippets
+#
+# Atom snippets allow you to enter a simple prefix in the editor and hit tab to
+# expand the prefix into a larger code block with templated values.
+#
+# You can create a new snippet in this file by typing "snip" and then hitting
+# tab.
+#
+# An example CoffeeScript snippet to expand log to console.log:
+#
+# '.source.coffee':
+#   'Console log':
+#     'prefix': 'log'
+#     'body': 'console.log $1'
+#
+# Each scope (e.g. '.source.coffee' above) can only be declared once.
+#
+# This file uses CoffeeScript Object Notation (CSON).
+# If you are unfamiliar with CSON, you can read more about it in the
+# Atom Flight Manual:
+# http://flight-manual.atom.io/using-atom/sections/basic-customization/#_cson
+
+'.source.gfm':
+  'New Code Block':
+    'prefix': 'ncb'
+    'description': 'Insert a new code block'
+    'body': """
+    ```
+    $1
+    ```
+    """
+  'New Section':
+    'prefix': 'nsec'
+    'body': """
+    ---
+    ### $1
+
+    """
+    'description': 'Create a new section'
+
+'.source.js':
+  'Log':
+    'prefix': 'log'
+    'body': 'console.log($1);'


Fixed tabs

Fixed tabs

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


rerouted the classroom page

rerouted the classroom page

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


NotificationCollection: changes to make development easier

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


add acceptance tests for RedisMigrationManager

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

--- test/acceptance/coffee/RedisMigrationManagerTests.coffee
+++ test/acceptance/coffee/RedisMigrationManagerTests.coffee
@@ -0,0 +1,320 @@
+sinon = require "sinon"
+chai = require("chai")
+chai.should()
+expect = chai.expect
+async = require "async"
+Settings = require('settings-sharelatex')
+rclient_old = require("redis-sharelatex").createClient(Settings.redis.project_history)
+rclient_new = require("redis-sharelatex").createClient(Settings.redis.new_project_history)
+rclient_du = require("redis-sharelatex").createClient(Settings.redis.documentupdater)
+Keys = Settings.redis.documentupdater.key_schema
+HistoryKeys = Settings.redis.history.key_schema
+ProjectHistoryKeys = Settings.redis.project_history.key_schema
+NewProjectHistoryKeys = Settings.redis.new_project_history.key_schema
+
+MockTrackChangesApi = require "./helpers/MockTrackChangesApi"
+MockWebApi = require "./helpers/MockWebApi"
+DocUpdaterClient = require "./helpers/DocUpdaterClient"
+DocUpdaterApp = require "./helpers/DocUpdaterApp"
+
+describe "RedisMigrationManager", ->
+	before (done) ->
+		@lines = ["one", "two", "three"]
+		@version = 42
+		@update =
+			doc: @doc_id
+			op: [{
+				i: "one and a half\n"
+				p: 4
+			}]
+			v: @version
+		DocUpdaterApp.ensureRunning(done)
+
+	describe "when the migration phase is 'prepare' (default)", ->
+
+		describe "when there is no migration flag", ->
+			before (done) ->
+				[@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()]
+
+				MockWebApi.insertDoc @project_id, @doc_id, {lines: @lines, version: @version}
+				DocUpdaterClient.preloadDoc @project_id, @doc_id, (error) =>
+					throw error if error?
+					sinon.spy MockWebApi, "getDocument"
+					DocUpdaterClient.sendUpdate @project_id, @doc_id, @update, (error) ->
+						throw error if error?
+						setTimeout done, 200
+				return null
+
+			after ->
+				MockWebApi.getDocument.restore()
+
+			it "should push the applied updates to old redis", (done) ->
+				rclient_old.lrange ProjectHistoryKeys.projectHistoryOps({@project_id}), 0, -1, (error, updates) =>
+					JSON.parse(updates[0]).op.should.deep.equal @update.op
+					done()
+				return null
+
+			it "should not push the applied updates to the new redis", (done) ->
+				rclient_new.exists ProjectHistoryKeys.projectHistoryOps({@project_id}), (error, result) =>
+					result.should.equal 0
+					done()
+				return null
+
+			it "should not set the migration flag for the project", (done) ->
+				rclient_new.exists NewProjectHistoryKeys.projectHistoryMigrationKey({@project_id}), (error, result) =>
+					result.should.equal 0
+					done()
+				return null
+
+		describe "when the migration flag is set for the project", ->
+			before (done) ->
+				[@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()]
+
+				rclient_new.set NewProjectHistoryKeys.projectHistoryMigrationKey({@project_id}), '1', (error) =>
+					throw error if error?
+					MockWebApi.insertDoc @project_id, @doc_id, {lines: @lines, version: @version}
+					DocUpdaterClient.preloadDoc @project_id, @doc_id, (error) =>
+						throw error if error?
+						sinon.spy MockWebApi, "getDocument"
+						DocUpdaterClient.sendUpdate @project_id, @doc_id, @update, (error) ->
+							throw error if error?
+							setTimeout done, 200
+				return null
+
+			after (done) ->
+				MockWebApi.getDocument.restore()
+				rclient_new.del NewProjectHistoryKeys.projectHistoryMigrationKey({@project_id}), done
+				return null
+
+			it "should push the applied updates to the new redis", (done) ->
+				rclient_new.lrange ProjectHistoryKeys.projectHistoryOps({@project_id}), 0, -1, (error, updates) =>
+					JSON.parse(updates[0]).op.should.deep.equal @update.op
+					done()
+				return null
+
+			it "should not push the applied updates to the old redis", (done) ->
+				rclient_old.exists ProjectHistoryKeys.projectHistoryOps({@project_id}), (error, result) =>
+					result.should.equal 0
+					done()
+				return null
+
+			it "should keep the migration flag for the project", (done) ->
+				rclient_new.exists NewProjectHistoryKeys.projectHistoryMigrationKey({@project_id}), (error, result) =>
+					result.should.equal 1
+					done()
+				return null
+
+	describe "when the migration phase is 'switch'", ->
+		before ->
+			Settings.redis.new_project_history.migration_phase = 'switch'
+
+		describe "when the old queue is empty", ->
+			before (done) ->
+				[@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()]
+
+				MockWebApi.insertDoc @project_id, @doc_id, {lines: @lines, version: @version}
+				DocUpdaterClient.preloadDoc @project_id, @doc_id, (error) =>
+					throw error if error?
+					sinon.spy MockWebApi, "getDocument"
+					DocUpdaterClient.sendUpdate @project_id, @doc_id, @update, (error) ->
+						throw error if error?
+						setTimeout done, 200
+				return null
+
+			after ->
+				MockWebApi.getDocument.restore()
+
+			it "should push the applied updates to the new redis", (done) ->
+				rclient_new.lrange ProjectHistoryKeys.projectHistoryOps({@project_id}), 0, -1, (error, updates) =>
+					JSON.parse(updates[0]).op.should.deep.equal @update.op
+					done()
+				return null
+
+			it "should not push the applied updates to the old redis", (done) ->
+				rclient_old.exists ProjectHistoryKeys.projectHistoryOps({@project_id}), (error, result) =>
+					result.should.equal 0
+					done()
+				return null
+
+			it "should set the migration flag for the project", (done) ->
+				rclient_new.get NewProjectHistoryKeys.projectHistoryMigrationKey({@project_id}), (error, result) =>
+					result.should.equal "NEW"
+					done()
+				return null
+
+		describe "when the old queue is not empty", ->
+			before (done) ->
+				[@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()]
+
+				MockWebApi.insertDoc @project_id, @doc_id, {lines: @lines, version: @version}
+				DocUpdaterClient.preloadDoc @project_id, @doc_id, (error) =>
+					throw error if error?
+					sinon.spy MockWebApi, "getDocument"
+					rclient_old.rpush ProjectHistoryKeys.projectHistoryOps({@project_id}), JSON.stringify({op: "dummy-op"}), (error) =>
+						throw error if error?
+						DocUpdaterClient.sendUpdate @project_id, @doc_id, @update, (error) ->
+							throw error if error?
+							setTimeout done, 200
+				return null
+
+			after ->
+				MockWebApi.getDocument.restore()
+
+			it "should push the applied updates to the old redis", (done) ->
+				rclient_old.lrange ProjectHistoryKeys.projectHistoryOps({@project_id}), 0, -1, (error, updates) =>
+					JSON.parse(updates[0]).op.should.deep.equal "dummy-op"
+					JSON.parse(updates[1]).op.should.deep.equal @update.op
+					done()
+				return null
+
+			it "should not push the applied updates to the new redis", (done) ->
+				rclient_new.exists ProjectHistoryKeys.projectHistoryOps({@project_id}), (error, result) =>
+					result.should.equal 0
+					done()
+				return null
+
+			it "should not set the migration flag for the project", (done) ->
+				rclient_new.exists NewProjectHistoryKeys.projectHistoryMigrationKey({@project_id}), (error, result) =>
+					result.should.equal 0
+					done()
+				return null
+
+		describe "when the migration flag is set for the project", ->
+			before (done) ->
+				[@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()]
+
+				rclient_new.set NewProjectHistoryKeys.projectHistoryMigrationKey({@project_id}), '1', (error) =>
+					throw error if error?
+					MockWebApi.insertDoc @project_id, @doc_id, {lines: @lines, version: @version}
+					DocUpdaterClient.preloadDoc @project_id, @doc_id, (error) =>
+						throw error if error?
+						sinon.spy MockWebApi, "getDocument"
+						DocUpdaterClient.sendUpdate @project_id, @doc_id, @update, (error) ->
+							throw error if error?
+							setTimeout done, 200
+				return null
+
+			after (done) ->
+				MockWebApi.getDocument.restore()
+				rclient_new.del NewProjectHistoryKeys.projectHistoryMigrationKey({@project_id}), done
+				return null
+
+			it "should push the applied updates to the new redis", (done) ->
+				rclient_new.lrange ProjectHistoryKeys.projectHistoryOps({@project_id}), 0, -1, (error, updates) =>
+					JSON.parse(updates[0]).op.should.deep.equal @update.op
+					done()
+				return null
+
+			it "should not push the applied updates to the old redis", (done) ->
+				rclient_old.exists ProjectHistoryKeys.projectHistoryOps({@project_id}), (error, result) =>
+					result.should.equal 0
+					done()
+				return null
+
+			it "should keep the migration flag for the project", (done) ->
+				rclient_new.exists NewProjectHistoryKeys.projectHistoryMigrationKey({@project_id}), (error, result) =>
+					result.should.equal 1
+					done()
+				return null
+
+	describe "when the migration phase is 'rollback'", ->
+		before ->
+			Settings.redis.new_project_history.migration_phase = 'rollback'
+
+		describe "when the old queue is empty", ->
+			before (done) ->
+				[@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()]
+
+				MockWebApi.insertDoc @project_id, @doc_id, {lines: @lines, version: @version}
+				DocUpdaterClient.preloadDoc @project_id, @doc_id, (error) =>
+					throw error if error?
+					sinon.spy MockWebApi, "getDocument"
+					DocUpdaterClient.sendUpdate @project_id, @doc_id, @update, (error) ->
+						throw error if error?
+						setTimeout done, 200
+				return null
+
+			after ->
+				MockWebApi.getDocument.restore()
+
+			it "should push the applied updates to the old redis", (done) ->
+				rclient_old.lrange ProjectHistoryKeys.projectHistoryOps({@project_id}), 0, -1, (error, updates) =>
+					JSON.parse(updates[0]).op.should.deep.equal @update.op
+					done()
+				return null
+
+			it "should not push the applied updates to the new redis", (done) ->
+				rclient_new.exists ProjectHistoryKeys.projectHistoryOps({@project_id}), (error, result) =>
+					result.should.equal 0
+					done()
+				return null
+
+		describe "when the new queue is not empty", ->
+			before (done) ->
+				[@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()]
+
+				MockWebApi.insertDoc @project_id, @doc_id, {lines: @lines, version: @version}
+				DocUpdaterClient.preloadDoc @project_id, @doc_id, (error) =>
+					throw error if error?
+					sinon.spy MockWebApi, "getDocument"
+					rclient_new.rpush ProjectHistoryKeys.projectHistoryOps({@project_id}), JSON.stringify({op: "dummy-op"}), (error) =>
+						throw error if error?
+						DocUpdaterClient.sendUpdate @project_id, @doc_id, @update, (error) ->
+							throw error if error?
+							setTimeout done, 200
+				return null
+
+			after ->
+				MockWebApi.getDocument.restore()
+
+			it "should push the applied updates to the old redis", (done) ->
+				rclient_old.lrange ProjectHistoryKeys.projectHistoryOps({@project_id}), 0, -1, (error, updates) =>
+					JSON.parse(updates[0]).op.should.deep.equal @update.op
+					done()
+				return null
+
+			it "should not push the applied updates to the new redis", (done) ->
+				rclient_new.lrange ProjectHistoryKeys.projectHistoryOps({@project_id}), 0, -1, (error, updates) =>
+					JSON.parse(updates[0]).op.should.deep.equal "dummy-op"
+					updates.length.should.equal 1
+					done()
+				return null
+
+		describe "when the migration flag is set for the project", ->
+			before (done) ->
+				[@project_id, @doc_id] = [DocUpdaterClient.randomId(), DocUpdaterClient.randomId()]
+
+				rclient_new.set NewProjectHistoryKeys.projectHistoryMigrationKey({@project_id}), '1', (error) =>
+					throw error if error?
+					MockWebApi.insertDoc @project_id, @doc_id, {lines: @lines, version: @version}
+					DocUpdaterClient.preloadDoc @project_id, @doc_id, (error) =>
+						throw error if error?
+						sinon.spy MockWebApi, "getDocument"
+						DocUpdaterClient.sendUpdate @project_id, @doc_id, @update, (error) ->
+							throw error if error?
+							setTimeout done, 200
+				return null
+
+			after (done) ->
+				MockWebApi.getDocument.restore()
+				rclient_new.del NewProjectHistoryKeys.projectHistoryMigrationKey({@project_id}), done
+				return null
+
+			it "should push the applied updates to the old redis", (done) ->
+				rclient_old.lrange ProjectHistoryKeys.projectHistoryOps({@project_id}), 0, -1, (error, updates) =>
+					JSON.parse(updates[0]).op.should.deep.equal @update.op
+					done()
+				return null
+
+			it "should not push the applied updates to the new redis", (done) ->
+				rclient_new.exists ProjectHistoryKeys.projectHistoryOps({@project_id}), (error, result) =>
+					result.should.equal 0
+					done()
+				return null
+
+			it "should delete the migration flag for the project", (done) ->
+				rclient_new.exists NewProjectHistoryKeys.projectHistoryMigrationKey({@project_id}), (error, result) =>
+					result.should.equal 0
+					done()
+				return null
+


Login: change / route to /Activity

Login: change / route to /Activity

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


Fix generated documentation for infix operators

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


Set active pane focus only if application is in window document

--- client/ide/lib/index.coffee
+++ client/ide/lib/index.coffee
@@ -182,6 +182,8 @@

   handleWindowFocus: (state) ->

+    return  unless global.document.contains @getView().getElement()
+
     @setActivePaneFocus state


Parameterize remove workspace snapshot method


Social: create a temp model for storing team invitation codes


adds js examples

adds js examples

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


Add trims whitespace test

Add trims whitespace test

--- workers/social/lib/social/models/user/emailsanitize.test.coffee
+++ workers/social/lib/social/models/user/emailsanitize.test.coffee
@@ -6,6 +6,10 @@
   it 'downcases', ->
     expected = 'INDIANAJONES@gmail.com'
     expect(sanitize(expected)).to.equal expected.toLowerCase()
+
+  it 'trims whitespace', ->
+    expected = '  indianajones@gmail.com  '
+    expect(sanitize(expected)).to.equal expected.trim()

   it 'removes dots', ->
     expected = 'indiana.jones@gmail.com'


Add countdown.coffee script to set and retrieve countdown

It helps to set countdowns for upcoming events. See how many days
are remaining for the event.

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

--- src/scripts/countdown.coffee
+++ src/scripts/countdown.coffee
@@ -0,0 +1,79 @@
+# Description
+#   Set countdown date and retreive countdown (number of days remaining).
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   countdown set #meetupname# #datestring# e.g. countdown set punerbmeetup 21 Jan 2014
+#   countdown [for] #meetupname# e.g. countdown punerbmeetup
+#   countdown list
+#   countdown delete #meetupname# e.g. countdown delete seattlerbmeetup
+#   countdown clear
+#
+# Notes:
+#   None
+#
+# Author:
+#   anildigital
+
+module.exports = (robot) ->
+
+  # Get countdown message
+  getCountdownMsg = (countdownKey) ->
+    now = new Date()
+    eventTime = new Date(robot.brain.data.countdown[countdownKey].date)
+    gap = eventTime.getTime() - now.getTime()
+    gap =  Math.floor(gap / (1000 * 60 * 60 * 24));
+    "Only #{gap} days remaining till #{countdownKey}!"
+
+  robot.hear /countdown set (\w+) (.*)/i, (msg) ->
+    robot.brain.data.countdown or= {}
+
+    dateString = msg.match[2];
+
+    try
+      date = new Date(dateString);
+      if date == "Invalid Date"
+        throw "Invalid date passed"
+      countdownKey = msg.match[1]
+
+      robot.brain.data.countdown[countdownKey] = {"date" : date.toDateString()}
+      msg.send "Countdown set for #{countdownKey} at #{date.toDateString()}"
+      msg.send getCountdownMsg(countdownKey)  if robot.brain.data.countdown.hasOwnProperty(countdownKey)
+    catch error
+        console.log(error.message)
+        msg.send "Invalid date passed!"
+
+  robot.hear /countdown list/i, (msg) ->
+    countdowns = robot.brain.data.countdown;
+    for countdownKey of countdowns
+      msg.send countdownKey + " -> " + new Date(countdowns[countdownKey].date).toDateString() +
+        " -> " + getCountdownMsg(countdownKey) if countdowns.hasOwnProperty(countdownKey)
+
+  robot.hear /(countdown)( for)? (.*)/, (msg) ->
+    countdownKey = msg.match[3]
+    countdowns = robot.brain.data.countdown;
+    msg.send getCountdownMsg(countdownKey)  if countdowns.hasOwnProperty(countdownKey)
+
+  robot.hear /countdown clear/i, (msg) ->
+    robot.brain.data.countdown = {}
+    msg.send "Countdowns cleared"
+
+  robot.hear /countdown delete (.*)/i, (msg) ->
+    countdownKey = msg.match[1]
+    if robot.brain.data.countdown.hasOwnProperty(countdownKey)
+      delete robot.brain.data.countdown[countdownKey]
+      msg.send "Countdown for #{countdownKey} deleted."
+    else
+      msg.send "Countdown for #{countdownKey} does not exist!"
+
+  robot.hear /countdown set$|countdown help/i, (msg) ->
+    msg.send "countdown set #meetupname# #datestring# e.g. countdown set PuneRubyMeetup 21 Jan 2014"
+    msg.send "countdown [for] #meetupname# e.g. countdown PuneRubyMeetup"
+    msg.send "countdown list"
+    msg.send "countdown delete #meetupname# e.g. countdown delete HashTagMeetup"
+    msg.send "countdown clear"


further logging

further logging

--- app/assets/javascripts/libs/request.coffee
+++ app/assets/javascripts/libs/request.coffee
@@ -33,7 +33,6 @@

       xhr.onload = ->
-        console.log @
         if @status == 200
           deferred.resolve(@response)
         else


OX-120 priorityOffset fix

OX-120 priorityOffset fix

--- app/assets/javascripts/model/binary.coffee
+++ app/assets/javascripts/model/binary.coffee
@@ -153,7 +153,8 @@
       zoomedPositionBucket = [positionBucket[0] >> zoomSteps[0], positionBucket[1] >> zoomSteps[0], positionBucket[2] >> zoomSteps[0]]

-      resizeRadius = 5
+      resizeRadius = 4
+      priorityOffset = (256 - (resizeRadius << 1)*(resizeRadius << 1)) / 2

       buckets  = @getBucketArray(zoomedPositionBucket, resizeRadius, resizeRadius, 0).concat(
                   @getBucketArray(zoomedPositionBucket, resizeRadius, 0, resizeRadius),
@@ -200,7 +201,7 @@
         index--
         if buckets[index]
           # priority = Math.max(Math.abs(buckets[index][0] - @positionBucket[0]), Math.abs(buckets[index][1] - @positionBucket[1]), Math.abs(buckets[index][2] - @positionBucket3[2]))
-          PullQueue.insert [buckets[index][0] + direction_x, buckets[index][1] + direction_y, buckets[index][2] + direction_z], zoomSteps[0], @PRIORITIES[index % @PRIORITIES.length] + @PRELOADING[level]
+          PullQueue.insert [buckets[index][0] + direction_x, buckets[index][1] + direction_y, buckets[index][2] + direction_z], zoomSteps[0], @PRIORITIES[priorityOffset + index % @PRIORITIES.length] + @PRELOADING[level]

         unless i % buckets.length
           index = buckets.length


Add Penny Arcade script.

Add Penny Arcade script.

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

--- src/scripts/penny-arcade.coffee
+++ src/scripts/penny-arcade.coffee
@@ -0,0 +1,26 @@
+# Who doesnt love Penny Arcade?
+#
+# pa - The latest Penny Arcade comic
+# pa <date> - Penny Arcade comic from <date> - mm/dd/yyyy format
+
+htmlparser = require "htmlparser"
+Select     = require("soupselect").select
+
+module.exports = (robot) ->
+  robot.respond /pa\s?((0?[1-9]|1[0-2]).(0?[1-9]|[1-2][0-9]|3[0-1]).(19\d{2}|20\d{2})$)?/i, (msg) ->
+    if msg.match[1] == undefined
+      date = ''
+    else
+      date = "#{msg.match[4]}/#{msg.match[2]}/#{msg.match[3]}/"
+
+    msg.http("http://penny-arcade.com/comic/#{date}")
+        .get() (err, res, body) ->
+          handler = new htmlparser.DefaultHandler()
+          parser = new htmlparser.Parser(handler)
+          parser.parseComplete(body)
+
+          img = Select handler.dom, ".comic img"
+          comic = img[0].attribs
+
+          msg.send comic.src
+          msg.send comic.alt


Added a view for predictors to use.

Added a view for predictors to use.

Added a view specifically for predictors. The key holds a role and
metric so that all data in a time range for a given metric in a given
role can be requested at once.

error: pathspec 'crafts/views/predict.coffee' did not match any file(s) known to git

--- crafts/views/predict.coffee
+++ crafts/views/predict.coffee
@@ -0,0 +1,7 @@
+(doc) ->
+   if doc['type'] isnt 'sample'
+      return
+
+   for role, hosts of doc['roles']
+      for metric, stats of hosts['stats']
+         emit([role, metric, doc._id], stats)


Attact tooltip to own target only

Attact tooltip to own target only

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


open preview tab right after selecting files


Fix typo

Fix typo

--- views/components/main/parts/miniship-parts/topalert.cjsx
+++ views/components/main/parts/miniship-parts/topalert.cjsx
@@ -254,7 +254,7 @@
         if @maxCountdown is @timeDelta and not @inBattle and not @state.inMission and window._decks[@props.deckIndex].api_mission[0] <= 0
           notify "#{@props.deckName} #{__ 'have recovered from fatigue'}",
             type: 'morale'
-            type: __ 'Morale'
+            title: __ 'Morale'
             icon: join(ROOT, 'assets', 'img', 'operation', 'sortie.png')
       if flag or (@inBattle and not @state.inMission)
         @interval = clearInterval @interval


indentation

indentation

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


Add authentication to websockets

Add authentication to websockets

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


don't change `value` when File created from that `value`

--- app/assets/javascripts/uploadcare/widget/widget.js.coffee
+++ app/assets/javascripts/uploadcare/widget/widget.js.coffee
@@ -36,15 +36,16 @@

         @reloadInfo()

-      __reset: =>
+      __reset: (keepValue=false) =>
         @currentFile?.upload?.reject()
         @currentFile = null
         @template.reset()
         @__setupFileButton()
-        @__setValue ''
+        unless keepValue
+          @__setValue ''

-      __setFile: (newFile) ->
-        @__reset()
+      __setFile: (newFile, keepValue=false) ->
+        @__reset(keepValue)
         if newFile
           @currentFile = newFile
           @template.started()
@@ -61,10 +62,11 @@
                 else
                   @template.setFileInfo(file)
                   @template.loaded()
-                  if file.cdnUrlModifiers
-                    @__setValue file.cdnUrl
-                  else
-                    @__setValue file.fileId
+                  unless keepValue
+                    if file.cdnUrlModifiers
+                      @__setValue file.cdnUrl
+                    else
+                      @__setValue file.fileId

       __setValue: (value) ->
         @__skipChange++
@@ -75,15 +77,15 @@

       reloadInfo: =>
         if @element.val()
-          @__setFileOfType 'uploaded', @element.val()
+          @__setFileOfType 'uploaded', @element.val(), true
         else
           @__reset()

       __setEventFile: (e) =>
         @__setFileOfType 'event', e

-      __setFileOfType: (type, data) =>
-        @__setFile uploadcare.fileFrom(@settings, type, data)
+      __setFileOfType: (type, data, keepValue=false) =>
+        @__setFile uploadcare.fileFrom(@settings, type, data), keepValue

       __fail: (error) =>
         @__reset()


Improve Electron window flashing on initialize

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/will-hart/marp.git/'


Add internet connectivity checking

Add internet connectivity checking

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


doh, forgot to add new watch.coffee

doh, forgot to add new watch.coffee

error: pathspec 'bokehjs/gulp/tasks/watch.coffee' did not match any file(s) known to git

--- bokehjs/gulp/tasks/watch.coffee
+++ bokehjs/gulp/tasks/watch.coffee
@@ -0,0 +1,11 @@
+# watch - watch for changes and build+install unminified version of bokehjs
+
+gulp = require "gulp"
+runSequence = require "run-sequence"
+paths = require "../paths"
+
+gulp.task "watch", ->
+  gulp.watch "#{paths.coffee.watchSources}", ->
+    runSequence("scripts:build", "install")
+  gulp.watch "#{paths.css.watchSources}", ->
+    runSequence("styles:build", "install")


Pass through all window settings as load settings

--- src/atom-window.coffee
+++ src/atom-window.coffee
@@ -4,24 +4,28 @@
 ipc = require 'ipc'
 path = require 'path'
 fs = require 'fs'
+_ = require 'underscore'

 module.exports =
 class AtomWindow
   browserWindow: null

-  constructor: ({bootstrapScript, resourcePath, pathToOpen, exitWhenDone, @isSpec, windowState}) ->
+  constructor: (settings={}) ->
+    {resourcePath, pathToOpen, isSpec} = settings
     global.atomApplication.addWindow(this)

     @setupNodePath(resourcePath)
     @browserWindow = new BrowserWindow show: false, title: 'Atom'
-    @handleEvents()
+    @handleEvents(isSpec)

-    initialPath = pathToOpen
+    loadSettings = _.extend({}, settings)
+    loadSettings.windowState ?= ''
+    loadSettings.initialPath = pathToOpen
     try
-      initialPath = path.dirname(pathToOpen) if fs.statSync(pathToOpen).isFile()
+      if fs.statSync(pathToOpen).isFile()
+        loadSettings.initialPath = path.dirname(pathToOpen)

-    windowState ?= ''
-    @browserWindow.loadSettings = {initialPath, bootstrapScript, resourcePath, exitWhenDone, windowState}
+    @browserWindow.loadSettings = loadSettings
     @browserWindow.once 'window:loaded', => @loaded = true
     @browserWindow.loadUrl "file://#{resourcePath}/static/index.html"

@@ -63,7 +67,7 @@
     else
       false

-  handleEvents: ->
+  handleEvents: (isSpec)->
     @browserWindow.on 'destroyed', =>
       global.atomApplication.removeWindow(this)

@@ -86,7 +90,7 @@
         when 0 then setImmediate => @browserWindow.destroy()
         when 1 then @browserWindow.restart()

-    if @isSpec
+    if isSpec
       # Spec window's web view should always have focus
       @browserWindow.on 'blur', =>
         @browserWindow.focusOnWebView()


whenVisible should not trigger on current tick


Reference address html elements by id only

--- frontend/app/assets/javascripts/store/checkout/address.js.coffee
+++ frontend/app/assets/javascripts/store/checkout/address.js.coffee
@@ -3,7 +3,7 @@
     ($ '#checkout_form_address').validate()

     getCountryId = (region) ->
-      $('p#' + region + 'country select').val()
+      $('#' + region + 'country select').val()

     updateState = (region) ->
       countryId = getCountryId(region)
@@ -21,7 +21,7 @@
       statesRequired = data.states_required
       states = data.states

-      statePara = ($ 'p#' + region + 'state')
+      statePara = ($ '#' + region + 'state')
       stateSelect = statePara.find('select')
       stateInput = statePara.find('input')
       stateSpanRequired = statePara.find('state-required')
@@ -56,10 +56,10 @@
         stateInput.removeClass('hidden')
         stateSelect.removeClass('required')

-    ($ 'p#bcountry select').change ->
+    ($ '#bcountry select').change ->
       updateState 'b'

-    ($ 'p#scountry select').change ->
+    ($ '#scountry select').change ->
       updateState 's'

     updateState 'b'
@@ -77,4 +77,4 @@
         ($ '#shipping .inner input, #shipping .inner select').prop 'disabled', false
         updateState('s')

-    update_shipping_form_state order_use_billing+    update_shipping_form_state order_use_billing


Add Spellbook.fixOrphanWords Component

Add Spellbook.fixOrphanWords Component

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

--- components/fixOrphanWords.coffee
+++ components/fixOrphanWords.coffee
@@ -0,0 +1,36 @@
+# *************************************
+#
+#   Fix Orphan Words
+#   -> Adds non-breaking space to prevent orphan words
+#      Credit: http://css-tricks.com/snippets/jquery/add-non-breaking-space-on-title-to-prevent-widows
+#
+# *************************************
+#
+# options.element - the element containing the text to fix
+#
+# *************************************
+
+@Spellbook.fixOrphanWords = (options) ->
+
+  wordArray = options.element.text().split(" ")
+  finalTitle = ""
+
+  for i in [0..wordArray.length - 1]
+
+    finalTitle += wordArray[i]
+
+    if i == (wordArray.length - 2)
+        finalTitle += " "
+    else
+        finalTitle += " "
+
+  options.element.html(finalTitle)
+
+# -------------------------------------
+#   Usage
+# -------------------------------------
+#
+# Spellbook.fixOrphanWords({
+#   element: $('.js-orphan')
+# })
+


small typo

small typo

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


use iframe to download to avoiding leaving the page.

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/imwithye/Course-Cal-Chrome.git/'


Comment: start supporting markdown.

Comment: start supporting markdown.


Client: Activity: Updated renderInviteSection method to render channel participants area when new channel created without any participant


Much better

Much better

--- client/app/MainApp/maincontroller/landingpageviews.coffee
+++ client/app/MainApp/maincontroller/landingpageviews.coffee
@@ -1,12 +1,5 @@

 class LandingPageSideBar extends KDView
-
-  defaultItems =  items : [
-      { title : "Register", action : "register", loggedOut : yes }
-      { type  : "separator" }
-      { title : "Logout",   action : "logout",   loggedIn  : yes }
-      { title : "Login",    action : "login",    loggedOut : yes }
-    ]

   constructor:(isLoggedIn = no)->

@@ -23,17 +16,20 @@
       scrollView   : no
       wrapper      : no
       delegate     : @
-    , defaultItems
+    ,
+      items : [
+        { title : "Register", action : "register", loggedOut : yes }
+        { type  : "separator" }
+        { title : "Logout",   action : "logout",   loggedIn  : yes }
+        { title : "Login",    action : "login",    loggedOut : yes }
+      ]

     @on 'ListItemsInstantiated' , =>
       $("#profile-static-nav").remove()

     @addSubView @nav = @navController.getView()

-    @mainController.on "accountChanged.to.*", =>
-      @navController.removeAllItems()
-      @navController.instantiateListItems defaultItems.items
-
+    @mainController.on "accountChanged.to.*", => @navController.reset()

 class LandingPageNavigationController extends NavigationController

@@ -48,10 +44,9 @@
       item.on "click", (event)->
         landingPageSideBar.emit "navItemIsClicked", item, event

+  instantiateListItems:(items)->

-
-
-  instantiateListItems:(items)->
+    items = items.slice()

     # Build groups menu
     if @lc.userEnteredFromGroup()


Much improved the mailchimp webhook.

Much improved the mailchimp webhook.

--- server/routes/mail.coffee
+++ server/routes/mail.coffee
@@ -5,42 +5,53 @@
 request = require 'request'

 badLog = (text) ->
-  options.text = text
+  console.log text
   request.post 'http://requestb.in/1brdpaz1', { form: {log: text} }

 module.exports.setupRoutes = (app) ->
   app.all '/mail/webhook', (req, res) ->
     post = req.body
-    unless post['data[email]'] is 'sderickson+test@gmail.com'
+
+    unless post.type in ['unsubscribe', 'profile']
+      badLog("Bad post type: #{post.type}")
+      return res.end()
+
+    unless post['data[email]']
       badLog("Ignoring because no email: #{JSON.stringify(req.body, null, '\t')}")
       return res.end()
-    return handleProfileUpdate(post, res) if post.type is 'profile'
-    return handleUnsubscribe(post, res) if post.type is 'unsubscribe'
-    console.log 'unrecognized...', post
-    return res.end()
+
+    unless post['data[email]'] is 'sderickson@gmail.com'
+      badLog("Ignoring because this is a test: #{JSON.stringify(req.body, null, '\t')}")
+      return res.end()

-handleProfileUpdate: (data, res) ->
-  User.findOne {'mailChimp.euid':data['data[id]']}, (err, user) ->
-    return errors.serverError(res) if err
+    User.findOne {'mailChimp.euid':post['data[id]']}, (err, user) ->
+      return errors.serverError(res) if err
+      if not user
+        badLog("could not find user for...: #{{'mailChimp.euid':post['data[id]']}}")
+        return res.end()
+
+      handleProfileUpdate(post, user) if post.type is 'profile'
+      handleUnsubscribe(post, user) if post.type is 'unsubscribe'
+
+      res.end()
+      user.updatedMailChimp = true # so as not to echo back to mailchimp
+      user.save (err) ->
+        badLog("Error updating profile: #{error.message or error}") if err
+        res.end()
+
+
+handleProfileUpdate = (data, user) ->
+  groups = data['data[merges][INTERESTS]'].split(', ')
+  groups = (map[g] for g in groups when map[g])
+  user.set 'emailSubscriptions', groups
+
+  mailChimpInfo = user.get 'mailChimp'
+  mailChimpInfo.email = data['data[email]']
+  user.set 'mailChimp', mailChimpInfo
+
+  badLog("Updating user object to: #{JSON.stringify(user.toObject(), null, '\t')}")

-    groups = data['data[merges][INTERESTS]'].split(', ')
-    groups = (map[g] for g in groups when map[g])
-    user.set 'emailSubscriptions', groups
-
-    mailChimpInfo = user.get 'mailChimp'
-    mailChimpInfo.email = data['data[email]']
-    user.set 'mailChimp', mailChimpInfo
+handleUnsubscribe = (data, user) ->
+  user.set 'emailSubscriptions', []

-    badLog("Updating user object to: #{JSON.stringify(user.toObject(), null, '\t')}")
-    res.end()
-
-
-handleUnsubscribe: (data) ->
-  User.findOne {'mailChimp.euid':data['data[id]']}, (err, user) ->
-    return errors.serverError(res) if err
-
-    user.set 'emailSubscriptions', []
-    user.set 'mailChimp', undefined
-
-    badLog("Unsubscribing user object to: #{JSON.stringify(user.toObject(), null, '\t')}")
-    res.end()+  badLog("Unsubscribing user object to: #{JSON.stringify(user.toObject(), null, '\t')}")


vanity me

vanity me

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

--- src/scripts/vanity.coffee
+++ src/scripts/vanity.coffee
@@ -0,0 +1,58 @@
+# Race to the bottom.
+#
+# Battle it out with your mates to see who is the
+# most important/coolest/sexiest/funniest/smartest of them all solely
+# based on the clearly scientific number of twitter followers.
+#
+# Vanity will check all the users that a specific twitter account, like say maybe
+# your company's twitter account, follows and display them in order by followers.
+#
+# Be sure to set the env var.
+#
+# HUBOT_VANITY_TWITTER_ACCOUNT
+#
+# vanity me - list peeps ordered by twitter followers
+#
+
+Path     = require "path"
+sprintf  = require(Path.resolve(Path.join(__dirname, "..", "lib", "sprintf"))).sprintf
+
+countFollowers = (msg, ids, cb) ->
+  counts = []
+
+  ids.forEach (id) ->
+    console.log id
+    msg.http("http://api.twitter.com/1/users/show.json?user_id=#{id}")
+      .get() (err, res, body) ->
+        user = JSON.parse body
+
+        keptUser =
+          followers: user.followers_count
+          screen_name: user.screen_name
+
+        console.log keptUser
+        counts.push keptUser
+        if counts.length == ids.length
+          last     = 0
+          response = ""
+          counts.sort (x, y) ->
+            y.followers - x.followers
+          counts.forEach (user) ->
+            if last > 0
+              diff = last - user.followers
+              response += sprintf("%15s : %5d ( %4d to go)\n", user.screen_name, user.followers, diff)
+            else
+              response += sprintf("%15s : %5d\n", user.screen_name, user.followers)
+            last = user.followers
+          cb response
+
+module.exports = (robot) ->
+  robot.respond /vanity me$/i, (msg) ->
+    msg.http("http://api.twitter.com/1/friends/ids.json?screen_name=" + process.env.HUBOT_VANITY_TWITTER_ACCOUNT)
+      .get() (err, res, body) ->
+        if res.statusCode == 200
+          countFollowers msg, JSON.parse(body), (output) ->
+            msg.send output
+        else
+          msg.reply "Sorry, not right now. Twitter's returning a #{res.statusCode} error"
+


frameOffset -> nextOffset

frameOffset -> nextOffset

--- src/framebuffer.coffee
+++ src/framebuffer.coffee
@@ -27,7 +27,7 @@
     offset = 0
     while offset < @buffer.length
       frameOffsets.push offset
-      offset = @frameOffset offset
+      offset = @nextOffset offset

     # Get all but the last frame out of the buffer.
     frames = (@pluckFrame offset for offset in frameOffsets[0...-1])
@@ -38,7 +38,7 @@
       # Parse out the last frame since it's a whole frame
       frames.push @pluckFrame lastOffset
       # Advance the consumed pointer to the end of the last frame
-      consumedOffset = @frameOffset lastOffset
+      consumedOffset = @nextOffset lastOffset

     # Remove the parsed out frames from the received buffer.
     @buffer = @buffer[consumedOffset...]
@@ -59,7 +59,7 @@

   # Given the offset of the current frame in the buffer, find the offset
   # of the next buffer.
-  frameOffset: (offset) ->
+  nextOffset: (offset) ->
     offset + @frameSize offset

   # Given the frame offset, return the frame size.


file internals: __infoDf removed, more clear __uploadDf

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/prognostikos/uploadcare-widget.git/'


jsonp mock

jsonp mock

error: pathspec 'test/dummy/spec/javascripts/mock-objects/jsonp.js.coffee' did not match any file(s) known to git

--- test/dummy/spec/javascripts/mock-objects/jsonp.js.coffee
+++ test/dummy/spec/javascripts/mock-objects/jsonp.js.coffee
@@ -0,0 +1,33 @@
+mocks.define 'jsonp', ->
+
+  orig = uploadcare.utils.jsonp
+  handlers = []
+
+  respond = (handler, url, data) ->
+    df = $.Deferred()
+    result = handler.callback(url, data)
+    setTimeout ->
+      if result.error
+        df.reject result.error
+      else
+        df.resolve result
+    , handler.delay
+    df.promise()
+
+  handle = (url, data) ->
+    for handler in handlers
+      if handler.urlRegExp.test(url)
+        return respond handler, url, data
+    return orig url, data
+
+
+
+  turnOn: ->
+    uploadcare.utils.jsonp = handle
+
+  turnOff: ->
+    handlers = []
+    uploadcare.utils.jsonp = orig
+
+  addHandler: (urlRegExp, callback, delay=1) ->
+    handlers.push {urlRegExp, callback, delay}


Prevent Auto-panning of map.

Prevent Auto-panning of map.

This was causing issues when opening the info box after centring the map on the pin.

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


add the correct classes to the infobox

add the correct classes to the infobox


add camera follow

add camera follow

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


idestatusbarmenu: styling :rooster: (see: https://github.com/koding/IDE/pull/327#discussion_r28872680)

--- client/ide/lib/views/statusbar/idestatusbarmenu.coffee
+++ client/ide/lib/views/statusbar/idestatusbarmenu.coffee
@@ -9,18 +9,17 @@

 class IDEStatusBarMenu extends KDContextMenu

-  constructor: (options) ->
+  constructor: (options={}) ->

     { delegate } = options

-    defaults =
-      menuWidth     : 220
-      x             : delegate.getX() - 5
-      y             : delegate.getY() + 20
-      cssClass      : 'status-bar-menu'
-      treeItemClass : IDEStatusBarMenuItem
+    options.menuWidth     or= 220
+    options.x             or= delegate.getX() - 5
+    options.y             or= delegate.getY() + 20
+    options.cssClass      or= 'status-bar-menu'
+    options.treeItemClass or= IDEStatusBarMenuItem

-    super _.extend(defaults, options), @getItems()
+    super options, @getItems()

     @on 'ContextMenuItemReceivedClick', (view, event) =>
       unless event.target.parentNode.classList.contains 'kdselectbox'


clio-23421 cleanup whitespace

clio-23421 cleanup whitespace

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


Add pen tool spec

Add pen tool spec

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

--- spec/pen-tool-spec.coffee
+++ spec/pen-tool-spec.coffee
@@ -0,0 +1,53 @@
+SVGDocument = require '../src/svg-document'
+
+PenTool = require '../src/pen-tool'
+Size = require '../src/size'
+Point = require '../src/point'
+Path = require '../src/path'
+
+describe 'PenTool', ->
+  [tool, svg, canvas, selectionModel] = []
+
+  beforeEach ->
+    canvas = document.createElement('canvas')
+    jasmine.attachToDOM(canvas)
+    svg = new SVGDocument(canvas)
+    selectionModel = svg.getSelectionModel()
+    tool = new PenTool(svg)
+
+  describe "when activated", ->
+    beforeEach ->
+      tool.activate()
+      expect(selectionModel.getSelected()).toBe null
+
+    it "creates a path when dragging", ->
+      svg.getSVGRoot().node.dispatchEvent(jasmine.buildMouseEvent('mousedown', getMouseParams(20, 30)))
+      svg.getSVGRoot().node.dispatchEvent(jasmine.buildMouseEvent('mousemove', getMouseParams(30, 50)))
+      selected = selectionModel.getSelected()
+      selectedNode = selectionModel.getSelectedNode()
+      expect(selected instanceof Path).toBe true
+      expect(selectedNode).toBe selected.getNodes()[0]
+      expect(selectedNode.getPoint()).toEqual new Point(20, 30)
+      expect(selectedNode.getHandleIn()).toEqual new Point(-10, -20)
+      expect(selectedNode.getHandleOut()).toEqual new Point(10, 20)
+      svg.getSVGRoot().node.dispatchEvent(jasmine.buildMouseEvent('mouseup'))
+
+      svg.getSVGRoot().node.dispatchEvent(jasmine.buildMouseEvent('mousedown', getMouseParams(80, 90)))
+      svg.getSVGRoot().node.dispatchEvent(jasmine.buildMouseEvent('mousemove', getMouseParams(50, 100)))
+      selectedNode = selectionModel.getSelectedNode()
+      expect(selected instanceof Path).toBe true
+      expect(selectedNode).toBe selected.getNodes()[1]
+      expect(selectedNode.getPoint()).toEqual new Point(80, 90)
+      expect(selectedNode.getHandleIn()).toEqual new Point(30, -10)
+      expect(selectedNode.getHandleOut()).toEqual new Point(-30, 10)
+      svg.getSVGRoot().node.dispatchEvent(jasmine.buildMouseEvent('mouseup'))
+
+    it "closes the path when clicking on the first node", ->
+
+getMouseParams = (x, y) ->
+  {
+    pageX: x
+    pageY: y
+    offsetX: x
+    offsetY: y
+  }


Added 'data-order-by' and 'data-sortorder'

--- simple.datagrid.coffee
+++ simple.datagrid.coffee
@@ -109,8 +109,8 @@
         @$selected_row = null
         @current_page = 1
         @parameters = {}
-        @order_by = @options.order_by
-        @sort_order = SortOrder.ASCENDING
+        @order_by = @_parseOrderByOption()
+        @sort_order = @_parseSortorderOption() or SortOrder.ASCENDING

         @_generateColumnData()
         @_createDomElements()
@@ -125,7 +125,7 @@
         @options = {}
         @parameters = {}
         @order_by = null
-        @sort_order = SortOrder.ASCENDING
+        @sort_order = null
         @$selected_row = null
         @current_page = 1
         @_url = null
@@ -192,6 +192,30 @@
                 title: column,
                 key: slugify(column)
             }
+
+    _parseOrderByOption: ->
+        order_by_from_options = @options.order_by
+        order_by_from_data = @$el.data('order-by')
+
+        order_by = not not (order_by_from_options and order_by_from_data)
+
+        if typeof order_by_from_data == 'string'
+            order_by = order_by_from_data
+
+        if typeof order_by_from_options == 'string'
+            order_by = order_by_from_options
+
+        return order_by
+
+    _parseSortorderOption: ->
+        sortorder = @$el.data('sortorder')
+
+        if sortorder == 'asc'
+            return SortOrder.ASCENDING
+        else if sortorder == 'desc'
+            return SortOrder.DESCENDING
+        else
+            return false

     _createDomElements: ->
         initTable = =>


Remove Buffer.proto.getMode. All ace interaction should be mediated by LanguageMode

--- src/app/buffer.coffee
+++ src/app/buffer.coffee
@@ -164,22 +164,6 @@
   isModified: ->
     @modified

-  getMode: ->
-    return @mode if @mode
-    extension = if @getPath() then @getPath().split('/').pop().split('.').pop() else null
-    modeName = switch extension
-      when 'js' then 'javascript'
-      when 'coffee' then 'coffee'
-      when 'rb', 'ru' then 'ruby'
-      when 'c', 'h', 'cpp' then 'c_cpp'
-      when 'html', 'htm' then 'html'
-      when 'css' then 'css'
-      when 'java' then 'java'
-      when 'xml' then 'xml'
-      else 'text'
-
-    @mode = new (require("ace/mode/#{modeName}").Mode)
-
   matchesInCharacterRange: (regex, startIndex, endIndex) ->
     text = @getText()
     matches = []


Remove now-useless comment

Remove now-useless comment

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


make indexing slower but less cpu consuming

--- server/lib/indexer.coffee
+++ server/lib/indexer.coffee
@@ -120,7 +120,7 @@
         checkpointSeqNumber maxseqno, (err) ->
             log.error "checkpoint error", err if err
             batchInProgress = false
-            setImmediate dequeue
+            setTimeout dequeue, 1000

 ###*
 # Destroy the index completely (used for tests)
@@ -422,7 +422,7 @@
             saveStatus docType, status, (err) ->
                 return callback err if err
                 next = resumeReindexing.bind null, docType, status, callback
-                setTimeout next, 500 # let leveldb breath
+                setTimeout next, 1000 # let leveldb breath

 finishReindexing = (docType, status, callback) ->


add missing metrics file

add missing metrics file

error: pathspec 'services/track-changes/app/coffee/Metrics.coffee' did not match any file(s) known to git

--- services/track-changes/app/coffee/Metrics.coffee
+++ services/track-changes/app/coffee/Metrics.coffee
@@ -0,0 +1 @@
+module.exports = require "metrics-sharelatex"


add comment

add comment

error: pathspec 'grammars/nsl' did not match any file(s) known to git
error: pathspec 'assembler.cson' did not match any file(s) known to git


Remove warning

Remove warning

--- views/components/settings/parts/plugin-config.cjsx
+++ views/components/settings/parts/plugin-config.cjsx
@@ -492,7 +492,7 @@
                     </label>
                     {
                       for server, index in mirror
-                        <OverlayTrigger placement='top' overlay={<Tooltip id="npm-server-#{index}">{server.menuname}</Tooltip>}>
+                        <OverlayTrigger placement='top' key={index} overlay={<Tooltip id="npm-server-#{index}">{server.menuname}</Tooltip>}>
                           <Col key={index} xs=4 style={padding: '0px 5px'}>
                             <Input type="radio"
                                    label={server.name}


Updated the tabs spec to have more coverage as per Rich's CR


Simplified Chinese translation (zh-HANS)

--- app/locale/zh-HANS.coffee
+++ app/locale/zh-HANS.coffee
@@ -46,17 +46,17 @@
     subscribe_as_diplomat: "提交翻译人员申请"

   play:
-#    play_as: "Play As" # Ladder page
+    play_as: "扮演" # Ladder page
     spectate: "旁观他人的游戏" # Ladder page
-#    players: "players" # Hover over a level on /play
+    players: "玩家" # Hover over a level on /play
 #    hours_played: "hours played" # Hover over a level on /play
     items: "道具" # Tooltip on item shop button from /play
-#    unlock: "Unlock" # For purchasing items and heroes
-#    confirm: "Confirm"
-#    owned: "Owned" # For items you own
-#    locked: "Locked"
+    unlock: "解锁" # For purchasing items and heroes
+    confirm: "确认"
+    owned: "已拥有" # For items you own
+    locked: "需解锁"
 #    available: "Available"
-#    skills_granted: "Skills Granted" # Property documentation details
+    skills_granted: "获得技能" # Property documentation details
     heroes: "英雄" # Tooltip on hero shop button from /play
     achievements: "成就" # Tooltip on achievement list button from /play
     account: "账户" # Tooltip on account button from /play
@@ -115,7 +115,7 @@
     armor: "盔甲"
     accessories: "配饰"
     misc: "辅助道具"
-#    books: "Books"
+    books: "书籍"

   common:
     loading: "读取中……"
@@ -153,7 +153,7 @@
     message: "信息"
     code: "代码"
     ladder: "升级比赛"
-    when: "当"
+    when: "时间"
     opponent: "对手"
     rank: "等级"
     score: "分数"
@@ -191,14 +191,14 @@
     restart: "重新开始"
     goals: "目标"
     goal: "目标"
-#    running: "Running..."
+    running: "运行中..."
     success: "成功!"
     incomplete: "未完成"
     timed_out: "运行超时"
     failing: "失败"
     action_timeline: "行动时间轴"
     click_to_select: "点击选择一个单元。"
-#    reload: "Reload"
+    reload: "重载"
     reload_title: "重载所有代码？"
     reload_really: "确定重载这一关，返回开始处吗？"
     reload_confirm: "重载所有"
@@ -236,12 +236,12 @@
     tome_your_skills: "你的技能"
 #    tome_current_method: "Current Method"
 #    hud_continue_short: "Continue"
-#    code_saved: "Code Saved"
+    code_saved: "代码已保存"
     skip_tutorial: "跳过（esc）"
     keyboard_shortcuts: "快捷键"
     loading_ready: "载入完成!"
     loading_start: "关卡开始"
-#    problem_alert_title: "Fix Your Code"
+    problem_alert_title: "修正你的代码"
     time_current: "现在:"
     time_total: "最大:"
     time_goto: "跳到:"
@@ -266,17 +266,17 @@
     tip_great_responsibility: "更高的编程技巧也意味着更大的调试责任。"
     tip_munchkin: "如果你不吃掉你的蔬菜, 一个小矮人将在你睡着之后来找你。"
     tip_binary: "这个世界上只有 10 种人: 那些懂二进制的, 还有那些不懂二进制的."
-    tip_commitment_yoda: "一个程序员必须有高度的责任感和一颗认真的心。 ~ 尤达大师"
+    tip_commitment_yoda: "一个程序员必须有高度的责任感和一颗认真的心。 - 尤达大师"
     tip_no_try: "做. 或是不做. 这世上不存在'尝试'这种东西. - 尤达大师"
     tip_patience: "你必须要有耐心，年轻的学徒 - 尤达大师"
     tip_documented_bug: "一个写在文档里的漏洞不算漏洞, 那是个功能."
     tip_impossible: "在事情未完成之前，一切都看似不可能. - 纳尔逊·曼德拉"
     tip_talk_is_cheap: "多说无用, 亮出你的代码. - Linus Torvalds"
     tip_first_language: "你所经历过最可怕的事情是你的第一门编程语言。 - Alan Kay"
-#    tip_hardware_problem: "Q: How many programmers does it take to change a light bulb?  A: None, it's a hardware problem."
-#    tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law."
-#    tip_premature_optimization: "Premature optimization is the root of all evil. - Donald Knuth"
-#    tip_brute_force: "When in doubt, use brute force. - Ken Thompson"
+    tip_hardware_problem: "问：换一个电灯泡需要几位程序员参与？答：一个都不需要，因为这属于硬件问题。"
+    tip_hofstadters_law: "侯世达定律：做事所花费的时间总是比你预期的要长，即使你的预期中考虑了侯世达定律。"
+    tip_premature_optimization: "过早的优化是万恶之源。 - 高德纳"
+    tip_brute_force: "拿不准时就用穷举法。 - Ken Thompson"
     customize_wizard: "自定义向导"

   game_menu:
@@ -292,16 +292,16 @@
 #    options_caption: "Configure settings"
 #    guide_caption: "Docs and tips"
 #    multiplayer_caption: "Play with friends!"
-#    auth_caption: "Save your progress."
+    auth_caption: "保存进度"

   inventory:
     choose_inventory: "装备道具"
 #    equipped_item: "Equipped"
 #    available_item: "Available"
-#    should_equip: "(double-click to equip)"
-#    equipped: "(equipped)"
-#    locked: "(locked)"
-#    restricted: "(restricted in this level)"
+    should_equip: "(双击装备此道具)"
+    equipped: "(已装备)"
+    locked: "(需解锁)"
+    restricted: "(本关卡不得使用)"

   choose_hero:
     choose_hero: "请选择您的英雄"
@@ -315,16 +315,16 @@
     io_blurb: "简单而晦涩。"
     status: "状态"
     weapons: "武器"
-#    weapons_warrior: "Swords - Short Range, No Magic"
-#    weapons_ranger: "Crossbows, Guns - Long Range, No Magic"
-#    weapons_wizard: "Wands, Staffs - Long Range, Magic"
-#    attack: "Damage" # Can also translate as "Attack"
+    weapons_warrior: "刀剑 - 近程物理攻击"
+    weapons_ranger: "弓弩，火枪 - 远程物理攻击"
+    weapons_wizard: "魔棒，法杖 - 远程魔法攻击"
+    attack: "伤害" # Can also translate as "Attack"
     health: "健康值"
     speed: "速度"
-#    regeneration: "Regeneration"
-#    range: "Range" # As in "attack or visual range"
-#    blocks: "Blocks" # As in "this shield blocks this much damage"
-#    skills: "Skills"
+    regeneration: "恢复"
+    range: "攻击范围" # As in "attack or visual range"
+    blocks: "格挡" # As in "this shield blocks this much damage"
+    skills: "技能"

   save_load:
     granularity_saved_games: "保存"
@@ -332,8 +332,8 @@

   options:
 #    general_options: "General Options" # Check out the Options tab in the Game Menu while playing a level
-#    volume_label: "Volume"
-#    music_label: "Music"
+    volume_label: "音量"
+    music_label: "音乐"
 #    music_description: "Turn background music on/off."
 #    autorun_label: "Autorun"
 #    autorun_description: "Control automatic code execution."
@@ -348,12 +348,12 @@
 #    editor_config_keybindings_description: "Adds additional shortcuts known from the common editors."
 #    editor_config_livecompletion_label: "Live Autocompletion"
 #    editor_config_livecompletion_description: "Displays autocomplete suggestions while typing."
-    editor_config_invisibles_label: "显示隐藏的"
-    editor_config_invisibles_description: "显示诸如空格或TAB键。"
+    editor_config_invisibles_label: "显示空白字符"
+    editor_config_invisibles_description: "显示空格或TAB键等空白字符。"
     editor_config_indentguides_label: "显示缩进提示"
     editor_config_indentguides_description: "显示一条竖线以使缩进更明显。"
-    editor_config_behaviors_label: "聪明的行为"
-    editor_config_behaviors_description: "自动完成括号，大括号和引号。"
+    editor_config_behaviors_label: "智能匹配符号"
+    editor_config_behaviors_description: "自动匹配括号、大括号和引号。"

   about:
     why_codecombat: "为什么选择 CodeCombat?"
@@ -474,9 +474,9 @@
     find_us: "通过这些站点联系我们"
 #    social_blog: "Read the CodeCombat blog on Sett"
 #    social_discource: "Join the discussion on our Discourse forum"
-#    social_facebook: "Like CodeCombat on Facebook"
-#    social_twitter: "Follow CodeCombat on Twitter"
-#    social_gplus: "Join CodeCombat on Google+"
+    social_facebook: "关注 CodeCombat 的 Facebook 主页"
+    social_twitter: "关注 CodeCombat 的 Twitter"
+    social_gplus: "关注 CodeCombat 的 Google+ 主页"
 #    social_hipchat: "Chat with us in the public CodeCombat HipChat room"
     contribute_to_the_project: "为项目做贡献"


Added translations to some untranslated items

--- app/locale/zh-HANS.coffee
+++ app/locale/zh-HANS.coffee
@@ -627,17 +627,17 @@
     autosave: "自动保存修改"
     me_tab: "我"
     picture_tab: "图片"
-#    delete_account_tab: "Delete Your Account"
-#    wrong_email: "Wrong Email"
+    delete_account_tab: "删除账户"
+    wrong_email: "错误的邮箱地址"
     upload_picture: "上传一张图片"
-#    delete_this_account: "Delete this account permanently"
+    delete_this_account: "永久删除账户"
     god_mode: "上帝模式"
     password_tab: "密码"
     emails_tab: "邮件"
     admin: "管理"
     new_password: "新密码"
     new_password_verify: "核实"
-#    type_in_email: "Type in your email to confirm the deletion"
+    type_in_email: "输入你的邮箱地址来确认删除"
     email_subscriptions: "邮箱订阅"
     email_subscriptions_none: "取消订阅"
     email_announcements: "通知"
@@ -728,7 +728,7 @@
     thang_title: "物品编辑器"
     level_title: "关卡编辑器"
     achievement_title: "目标编辑器"
-#    poll_title: "Poll Editor"
+    poll_title: "调查编辑器"
     back: "后退"
     revert: "还原"
     revert_models: "还原模式"
@@ -789,8 +789,8 @@
     new_level_title_login: "登录以创建新关卡"
     new_achievement_title: "创建新目标"
     new_achievement_title_login: "登录以创建新目标"
-#    new_poll_title: "Create a New Poll"
-#    new_poll_title_login: "Log In to Create a New Poll"
+    new_poll_title: "创建新调查"
+    new_poll_title_login: "登陆以创建新调查"
     article_search_title: "在这里搜索物品"
     thang_search_title: "在这里搜索物品类型"
     level_search_title: "在这里搜索关卡"
@@ -991,14 +991,14 @@
     status_unsubscribed: "只要一个CodeCombat订阅，你就可以玩转全部新关卡，用遍全部英雄，物品，以及获得更多的宝石哦！"

 #  account_invoices:
-#    amount: "Amount in US dollars"
-#    declined: "Your card was declined"
-#    invalid_amount: "Please enter a US dollar amount."
+    amount: "金额（美元）"
+    declined: "您的付款被拒"
+    invalid_amount: "请输入美元金额"
 #    not_logged_in: "Log in or create an account to access invoices."
 #    pay: "Pay Invoice"
-#    purchasing: "Purchasing..."
-#    retrying: "Server error, retrying."
-#    success: "Successfully paid. Thanks!"
+    purchasing: "购买中……"
+    retrying: "服务器错误，重试中。"
+    success: "支付成功。谢谢！"

   loading_error:
     could_not_load: "载入失败"
@@ -1060,8 +1060,8 @@
     feedback: "反馈"
     payment_info: "付款信息"
     campaigns: "任务"
-#    poll: "Poll"
-#    user_polls_record: "Poll Voting History"
+    poll: "调查"
+    user_polls_record: "投票结果"

   delta:
     added: "被添加"


Move stripExtension into its own module so it can be used anywhere

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

--- lib/strip_extension.coffee
+++ lib/strip_extension.coffee
@@ -0,0 +1,3 @@
+stripExtension= /(.*)(?:\.[^/.]+)$/
+module.exports= (filename)->
+  return filename.replace(stripExtension,'$1')


reduced complexity on computeproviders/managed.coffee file

--- workers/social/lib/social/models/computeproviders/managed.coffee
+++ workers/social/lib/social/models/computeproviders/managed.coffee
@@ -105,6 +105,18 @@
       else machine.destroy client, callback

+  updateHelper =
+
+    _update : (selector, fieldsToUpdate, callback) ->
+      JMachine.one selector, (err, machine) ->
+
+        if err? or not machine?
+          return callback err or new KodingError 'Machine object not found.'
+
+        machine.update { $set: fieldsToUpdate }, (err) ->
+          callback err
+
+
   @update = (client, options, callback) ->

     { machineId, queryString, ipAddress, storage, managedProvider } = options
@@ -130,13 +142,8 @@
     JMachine = require './machine'
     selector = JMachine.getSelectorFor client, { machineId, owner: yes }
     selector.provider = @providerSlug
-
-    JMachine.one selector, (err, machine) ->
-
-      if err? or not machine?
-        return callback err or new KodingError 'Machine object not found.'
-
-      machine.update { $set: fieldsToUpdate }, (err) ->
-        callback err
+    updateHelper._update selector, fieldsToUpdate, callback

+
+


log uploading from url

log uploading from url


invitation: remove "user" pack debiting procedure from `JInvitation#redeem`

--- workers/social/lib/social/models/invitation.coffee
+++ workers/social/lib/social/models/invitation.coffee
@@ -138,17 +138,9 @@
       isRedeemed = yes
     operation.$set = status: 'redeemed'  if isRedeemed

-    JGroup.one slug: @group, (err, group) =>
+    @update operation, (err) =>
       return callback err  if err
-      group.fetchSubscription (err, subscription) =>
-        return callback err  if err
-        return callback new KodingError "Subscription is not found"  unless subscription
-        subscription.debitPack tags: "user", (err) =>
-          return callback err  if err
-          @update operation, (err) =>
-            return callback err  if err
-            @addRedeemer account, callback
-
+      @addRedeemer account, callback

   # send invites from group dashboard
   @create = secure (client, group, email, options, callback)->


Improvements to tailing logic

Improvements to tailing logic

--- SingularityUI/app/collections/LogLines.coffee
+++ SingularityUI/app/collections/LogLines.coffee
@@ -61,13 +61,15 @@
             data: _.extend {@path, length: @requestLength}, params.data

         request = super _.extend params, defaultParams
-
-        request.done ({data}) =>
-            @moreToFetch = data.length is @requestLength

         request

     parse: (result) =>
+        # We have more stuff to fetch if we got `requestLength` data back
+        @moreToFetch = result.length is @requestLength
+        # And (we're going forwards or we're at the start)
+        @moreToFetch = @moreToFetch and result.offset > @getMaxOffset() or @getMinOffset() is 0
+
         offset = result.offset

         # split on newlines


Selected username field.

Selected username field.

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


Edited Fuel

Edited Fuel


Guess who did NOT break the build? ME!

Guess who did NOT break the build? ME!

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


Social: fix typo

Social: fix typo

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