Initial copy of ObjectLogger

Initial copy of ObjectLogger

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

--- ObjectLogger.coffee
+++ ObjectLogger.coffee
@@ -0,0 +1,81 @@
+class @ObjectLogger
+
+  loggerMethods:[
+    'debug'
+#    'enter'
+    'error'
+    'fatal'
+    'fine'
+#    'fineEnter'
+#    'fineReturn'
+#    'return'
+    'info'
+    'trace'
+    'warn'
+  ]
+
+  methodStack = []
+
+
+  constructor:(@className = "Object")->
+    if lv.Settings.getSetting("USE_CONSOLE_LOGGER",false)
+      return loglevel
+
+    self = @
+    @enter = @_createEnterMethod()
+    @fineEnter = @_createEnterMethod("fineEnter")
+    @['return'] = @_createReturnMethod()
+    @['fineReturn'] = @_createReturnMethod("fineReturn")
+    for method in @loggerMethods # Add all methods from global log
+      self[method] = @reflectionLog(method)
+
+  reflectionLog:(method)->
+    self = @
+    ->
+      if (methodStack.length > 0)
+        msg =  @_createMethodMessage methodStack[ methodStack.length - 1]
+      else # if there is no methodStack the method was called from a unknown method
+        msg = self.className+".unknownMethod():"
+
+      args = Array.prototype.slice.call(arguments) #convert the arguments obj to an array
+      if typeof args[0] is 'string'
+        args[0] =  msg + args[0]
+      else
+        args.unshift(msg) # put the msg on the top of the arguments
+
+      log[method].apply(log,args) # call the original method
+
+
+  _createEnterMethod:(_methodName = "enter")->
+    return ->
+      if arguments.length > 2
+        id = arguments[0]
+        name = arguments[1]
+        args = arguments[2]
+      else
+        name = arguments[0]
+        args = arguments[1]
+
+      method = id:id,name:name
+      methodStack.push(method)
+      msg = @_createMethodMessage method
+      msg += capitalize(_methodName)
+      log[_methodName].call(log,msg,args)
+
+
+  _createReturnMethod:(_methodName = "return")->
+    return ->
+      msg = @_createMethodMessage methodStack.pop()
+      msg += capitalize(_methodName)
+      log[_methodName].call(log,msg)
+
+
+  _createMethodMessage:(method)->
+    if not method
+      return ""
+    if method.id # prototype methods
+      return "#{@className}[#{method.id}].#{method.name}():" # i.e Object[id].method: 'customMessage'
+    "#{@className}.#{method?.name}():" # i.e Object.method: 'customMessage'
+
+  capitalize = (s)->
+    s.charAt(0).toUpperCase() + s.slice(1)


Documentation: workspace.open( ) refrasing

--- src/workspace.coffee
+++ src/workspace.coffee
@@ -371,8 +371,8 @@
   Section: Opening
   ###

-  # Essential: Open a given URI in Atom asynchronously.
-  # If no URI is given, or URI does not resolve to an existing file,
+  # Essential: Opens the given URI in Atom asynchronously, if it's not already open.
+  # If no URI is given, or the URI is the path of a file that does not exist,
   # a new empty text edtior is created.
   #
   # * `uri` (optional) A {String} containing a URI.


calendar icon idk

calendar icon idk

--- resources/assets/coffee/react/beatmap-discussions/discussions.coffee
+++ resources/assets/coffee/react/beatmap-discussions/discussions.coffee
@@ -30,7 +30,7 @@
       if Date.parse(a.updated_at) < Date.parse(b.updated_at) then 1 else -1

   created_at:
-    icon: 'arrow-down'
+    icon: 'calendar'
     text: osu.trans('beatmaps.discussions.sort.post-time')
     sort: (a, b) ->
       if Date.parse(a.created_at) > Date.parse(b.created_at) then 1 else -1


Don't show 0.00 amounts in Payments

Don't show 0.00 amounts in Payments

[Fixes #54564180.]

--- client/helpers/payments.coffee
+++ client/helpers/payments.coffee
@@ -80,15 +80,18 @@
     ]
   }
   # TODO: Make this use some function with customizable optionText (perhaps via a callback)
+  selectExpenses = []
   for expense in expenses
-    expense.dueDate = formatDate expense.dueDate
-    ear = accounting.formatMoney expense.amountRemaining
-    ea = accounting.formatMoney expense.amount
-    {
-      optionValue: expense._id
-      optionText: "#{expense.dueDate} — #{expense.description} (#{ear} of #{ea} remaining)"
-      selected: if expense._id is @expenseId then true else false
-    }
+    if Math.abs(accounting.formatMoney(expense.amountRemaining)) isnt 0.00
+      expense.dueDate = formatDate expense.dueDate
+      ear = accounting.formatMoney expense.amountRemaining
+      ea = accounting.formatMoney expense.amount
+      selectExpenses.push {
+        optionValue: expense._id
+        optionText: "#{expense.dueDate} — #{expense.description} (#{ear} of #{ea} remaining)"
+        selected: if expense._id is @expenseId then true else false
+      }
+  selectExpenses

 Template.paymentForm.incomes = ->
   incomes = getIncomes undefined, undefined, {
@@ -98,15 +101,18 @@
     ]
   }
   # TODO: Make this use some function with customizable optionText (perhaps via a callback)
+  selectIncomes = []
   for income in incomes
-    income.receiptDate = formatDate income.receiptDate
-    iar = accounting.formatMoney income.amountRemaining
-    ia = accounting.formatMoney income.amount
-    {
-      optionValue: income._id
-      optionText: "#{income.receiptDate} — #{income.description} (#{iar} of #{ia} remaining)"
-      selected: if income._id is @incomeId then true else false
-    }
+    if Math.abs(accounting.formatMoney(income.amountRemaining)) isnt 0.00
+      income.receiptDate = formatDate income.receiptDate
+      iar = accounting.formatMoney income.amountRemaining
+      ia = accounting.formatMoney income.amount
+      selectIncomes.push {
+        optionValue: income._id
+        optionText: "#{income.receiptDate} — #{income.description} (#{iar} of #{ia} remaining)"
+        selected: if income._id is @incomeId then true else false
+      }
+  selectIncomes

 Template.paymentForm.events {
   'click .add-payment': (event) ->


Correct --watch option on coffee:test Gulp task.

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


uptime 增加内存信息

uptime 增加内存信息

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


user coffeescript

user coffeescript

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

--- app/assets/javascripts/users.coffee
+++ app/assets/javascripts/users.coffee
@@ -0,0 +1,3 @@
+# Place all the behaviors and hooks related to the matching controller here.
+# All this logic will automatically be available in application.js.
+# You can use CoffeeScript in this file: http://coffeescript.org/


Fixed #951. The parser was removing the shadow shape but not the tween of the shadow.

--- app/lib/sprites/SpriteParser.coffee
+++ app/lib/sprites/SpriteParser.coffee
@@ -379,7 +379,9 @@
         argsSource = argsSource.replace(/cjs(.+)\)/, '"createjs$1)"') # turns cjs.Ease.get(0.5)

         args = eval "[#{argsSource}]"
-        if args[0]?.state?[0]?.t?.search?("shape") is 0 and not _.find(localShapes, bn: args[0].state[0].t)
+        shadowTween = args[0]?.search?('shape') is 0 and not _.find(localShapes, bn: args[0])
+        shadowTween = shadowTween or args[0]?.state?[0]?.t?.search?("shape") is 0 and not _.find(localShapes, bn: args[0].state[0].t)
+        if shadowTween
           console.log "Skipping tween", name, argsSource, args, "from localShapes", localShapes, "presumably because it's a shadow we skipped."
           return
         callExpressions.push {n: name, a: args}


Add blockquotes to the list of parsers

Add blockquotes to the list of parsers

error: pathspec 'lib/written/app/assets/javascripts/written/parsers/block/quote.coffee' did not match any file(s) known to git

--- lib/written/app/assets/javascripts/written/parsers/block/quote.coffee
+++ lib/written/app/assets/javascripts/written/parsers/block/quote.coffee
@@ -0,0 +1,47 @@
+class Quote
+  multiline: true
+
+  constructor: (match) ->
+    @matches = [match]
+    @opened = true
+
+  accepts: (text) ->
+    @opened = Quote.rule.test(text)
+
+  append: (text) ->
+    @matches.push(Quote.rule.exec(text))
+
+  processContent: (callback) =>
+    if @content?
+      throw "Content Error: The content was already processed"
+      return
+
+    lines = @matches.map (match) ->
+      match[2]
+
+    @content = callback(lines)
+
+  identical: (current, rendered) ->
+    current.outerHTML == rendered.outerHTML
+
+  markdown: =>
+    node = "

".toHTML()
+    for line, index in @content
+      p = "
".toHTML()
+      p.appendChild(document.createTextNode(@matches[index][1]))
+
+      for text in line
+        if text.markdown?
+          p.appendChild(text.markdown())
+        else
+          p.appendChild(document.createTextNode(text.toString()))
+
+      if index < @content.length - 1
+        p.insertAdjacentHTML('beforeend', '\n')
+      node.appendChild(p)
+
+    node
+
+Quote.rule = /^(>\s)(.*)/i
+
+Written.Parsers.Block.register Quote


add specs for admin users controller (angular)

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


Fixed few small issues on sharing tab

Fixed few small issues on sharing tab

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


Update test to use meta-/ instead of meta-s

--- spec/atom/vim-mode-spec.coffee
+++ spec/atom/vim-mode-spec.coffee
@@ -20,7 +20,7 @@
       editor.trigger event
       expect(event.stopPropagation).toHaveBeenCalled()

-      event = keydownEvent('s', metaKey: true)
+      event = keydownEvent('/', metaKey: true)
       spyOn(event, 'stopPropagation')
       editor.trigger event
       expect(event.stopPropagation).not.toHaveBeenCalled()


Find destination editor in single query

Find destination editor in single query

--- src/packages/tabs/lib/tab-view.coffee
+++ src/packages/tabs/lib/tab-view.coffee
@@ -89,9 +89,7 @@
       fromEditor.moveEditSessionToIndex(fromIndex, toIndex)
       fromEditor.focus()
     else
-      toPane = $(rootView.find('.pane')[toPaneIndex])
-      toEditor = toPane.find('.editor').view()
-
+      toEditor = rootView.find(".pane:eq(#{toPaneIndex}) > .editor").view()
       unless @containsEditSession(toEditor, fromEditor.editSessions[draggedTab.index()])
         fromEditor.moveEditSessionToEditor(draggedTab.index(), toEditor, droppedNearTab.index() + 1)
         toEditor.focus()


changed to process.stdout.write

changed to process.stdout.write

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


mobvious helpers for coffeescript

mobvious helpers for coffeescript

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

--- app/assets/javascripts/mobvious-rails.js.coffee
+++ app/assets/javascripts/mobvious-rails.js.coffee
@@ -0,0 +1,6 @@
+if window.Mobvious == undefined
+  window.Mobvious = {}
+
+Mobvious.for_device = (wanted_device_type, fn) ->
+  if Mobvious.device_type == wanted_device_type
+    return fn()


Introduce EventType model.

Introduce EventType model.

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

--- app/assets/javascripts/models/event_type.coffee
+++ app/assets/javascripts/models/event_type.coffee
@@ -0,0 +1,7 @@
+A = DS.attr
+
+Pancakes.EventType = DS.Model.extend
+  local_code: A 'integer'
+  display_text: A 'string'
+
+# vim:ts=2:sw=2:et:tw=78


add pattern

add pattern

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

--- app/scripts/helper/pattern.coffee
+++ app/scripts/helper/pattern.coffee
@@ -0,0 +1,107 @@
+patterns =
+  # 当前校验的元素，默认没有，在 `validate()` 方法中传入
+  # $item: {}
+
+  email: (text) ->
+    /^(?:[a-z0-9]+[_\-+.]+)*[a-z0-9]+@(?:([a-z0-9]+-?)*[a-z0-9]+.)+([a-z]{2,})+$/i.test(text)
+
+  # 仅支持 8 种类型的 day
+  # 20120409 | 2012-04-09 | 2012/04/09 | 2012.04.09 | 以上各种无 0 的状况
+  date: (text) ->
+    reg = /^([1-2]\d{3})([-\/.])?(1[0-2]|0?[1-9])([-\/.])?([1-2]\d|3[01]|0?[1-9])$/
+
+    return false if (!reg.test(text))
+
+    taste = reg.exec(text)
+    year = +taste[1]
+    month = +taste[3] - 1
+    day = +taste[5]
+    d = new Date(year, month, day)
+
+    year is d.getFullYear() and month is d.getMonth() and day is d.getDate()
+
+  # 手机：仅中国手机适应；以 1 开头，第二位是 3-9，并且总位数为 11 位数字
+  mobile: (text) ->
+    /^1[3|4|5|7|8|9]\d{9}$/.test(text)
+
+  # 座机：仅中国座机支持；区号可有 3、4位数并且以 0 开头；电话号不以 0 开头，最 8 位数，最少 7 位数
+  # 但 400/800 除头开外，适应电话，电话本身是 7 位数
+  # 0755-29819991 | 0755 29819991 | 400-6927972 | 4006927927 | 800...
+  tel: (text) ->
+    /^(?:(?:0\d{2,3}[- ]?[1-9]\d{6,7})|(?:[48]00[- ]?[1-9]\d{6}))$/.test(text)
+
+  number: (text) ->
+    min = +this.$item.attr('min')
+    max = +this.$item.attr('max')
+    result = /^\-?(?:[1-9]\d*|0)(?:[.]\d+)?$/.test(text)
+    text = +text
+    step = +this.$item.attr('step')
+
+    # ignore invalid range silently
+    isNaN(min) and (min = text - 1)
+    isNaN(max) and (max = text + 1)
+
+    # 目前的实现 step 不能小于 0
+    result and ( if isNaN(step) or 0 >= step then text >= min and text <= max else 0 is (text + min) % step and (text >= min and text <= max))
+
+  # 判断是否在 min / max 之间
+  range: (text) ->
+    this.number(text)
+
+  # 支持类型:
+  # http(s)://(username:password@)(www.)domain.(com/co.uk)(/...)
+  # (s)ftp://(username:password@)domain.com/...
+  # git://(username:password@)domain.com/...
+  # irc(6/s)://host:port/... 需要测试
+  # afp over TCP/IP: afp://[<user>@]<host>[:<port>][/[<path>]]
+  # telnet://<user>:<password>@<host>[:<port>/]
+  # smb://[<user>@]<host>[:<port>][/[<path>]][?<param1>=<value1>[;<param2>=<value2>]]
+  url: (text) ->
+    protocols = '((https?|s?ftp|irc[6s]?|git|afp|telnet|smb):\\/\\/)?'
+    userInfo = '([a-z0-9]\\w*(\\:[\\S]+)?\\@)?'
+    domain = '(?:[a-z0-9]+(?:\-[\w]+)*\.)*[a-z]{2,}'
+    port = '(:\\d{1,5})?'
+    ip = '\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}'
+    address = '(\\/\\S*)?'
+    domainType = [protocols, userInfo, domain, port, address]
+    ipType = [protocols, userInfo, ip, port, address]
+    validate
+
+    validate = (type) ->
+      new RegExp('^' + type.join('') + '$', 'i').test(text)
+
+    validate(domainType) or validate(ipType)
+
+  # 密码项目前只是不为空就 ok，可以自定义
+  password: (text) ->
+    this.text(text)
+
+  checkbox: ->
+    patterns._checker('checkbox')
+
+  # radio 根据当前 radio 的 name 属性获取元素，只要 name 相同的这几个元素中有一个 checked，则验证难过
+  radio: (checkbox) ->
+    patterns._checker('radio')
+
+  _checker: (type) ->
+    # TODO: a better way?!
+    form = this.$item.parents('form').eq(0)
+    identifier = 'input:' + type + '[name="' + this.$item.attr('name') + '"]'
+    result = false
+    $items = $(identifier, form)
+
+    # TODO: a faster way?!
+    _.each items (item) ->
+      result = true if item.checked and !result
+
+    result
+
+  # text[notEmpty] 表单项不为空
+  # [type=text] 也会进这项
+  text: (text) ->
+    max = parseInt(this.$item.attr('maxlength'), 10)
+
+    notEmpty = (text) ->
+      !!text.length and !/^\s+$/.test(text)
+
+    if isNaN(max) then notEmpty(text) else notEmpty(text) and text.length <= max


Finder: Controller: fix broken expandFolders and top folder flow

--- client/finder/lib/filetree/controllers/nfindercontroller.coffee
+++ client/finder/lib/filetree/controllers/nfindercontroller.coffee
@@ -111,7 +111,7 @@

     { uid } = machine
     mRoots  = (@appStorage.getValue 'machineRoots') or {}
-    path    = options.mountPath or mRoots[uid] or '/'
+    path    = mRoots[uid] or options.mountPath or '/'
     path   ?= '/root'  if machine.isManaged()
     path   ?= if owner = machine.getOwner()
     then "/home/#{owner}"
@@ -252,6 +252,7 @@
     return  unless folderPath
     for own path, node of @treeController.nodes
       return @treeController.expandFolder node, callback  if path is folderPath
+
     callback { message:"Folder not exists: #{folderPath}" }

@@ -259,7 +260,9 @@

     if typeof paths is 'string'
       paths = FSHelper.getPathHierarchy paths
-    path = paths.pop()
+
+    path = paths.shift()
+
     @expandFolder path, (err) =>
       @unsetRecentFolder path  if err
       if paths.length is 0
@@ -270,11 +273,15 @@
   reloadPreviousState: (uid) ->

     recentFolders = @getRecentFolders()
+
     if uid
+
       recentFolders = recentFolders.filter (folder) ->
-        folder.indexOf "[#{uid}]" is 0
+        folder.indexOf("[#{uid}]") is 0
+
       if recentFolders.length is 0
         recentFolders = ["[#{uid}]/"]
+
     @expandFolders recentFolders


Basic rendering of a dual-value bar chart.

error: pathspec 'app/scripts/directives/compare-bar-chart.coffee' did not match any file(s) known to git

--- app/scripts/directives/compare-bar-chart.coffee
+++ app/scripts/directives/compare-bar-chart.coffee
@@ -0,0 +1,50 @@
+'use strict';
+
+angular.module('appApp.directives')
+  .directive 'compareBarChart', [->
+    restrict: 'E'
+    scope:
+      data: '='
+      onClick: '&'
+
+    link: (scope, element, attrs) ->
+      # on window resize, redraw d3 canvas
+      scope.$watch( (()-> angular.element(window)[0].innerWidth), ((newValue, oldValue)-> scope.drawBarChart()) )
+      window.onresize = (()-> scope.$apply())
+
+      svg = d3.select(element[0]).append("svg")
+        .attr('class', 'bar-holder')
+        .style('fill', '#ddd')
+        .attr('width', "100%") # arbitrary
+        .attr('height', 100) # arbitrary
+
+      scope.drawBarChart = () ->
+        scope.$watch 'data', (newVals, oldVals) ->
+          console.log newVals, oldVals
+          svg.selectAll('*').remove
+          if not newVals
+            return # no change, do nothing
+
+          this_data = [-newVals.amount2, newVals.amount1]
+
+          x0 = Math.max(-d3.min(this_data), d3.max(this_data))
+
+          x = d3.scale.linear()
+            .domain([-x0, x0])
+            .range([0, '100%'])
+            .nice()
+
+          svg.selectAll("rect")
+            .data(this_data)
+            .enter().append("rect")
+            .attr('class', (d, i) ->
+              return 'bar' + (i+1)
+            ).attr("x", (d, i) ->
+              return x(Math.min(0, d))
+            ).attr("y", 0)
+            .attr("width", x)
+            .attr("height", 30)
+
+      scope.drawBarChart()
+
+  ]


Added scroll to bottom

Added scroll to bottom

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/dennee/Simple-Chat.git/'


fi.coffee translated: loading error

fi.coffee translated: loading error

--- app/locale/fi.coffee
+++ app/locale/fi.coffee
@@ -1149,18 +1149,18 @@
     retrying: "Palvelinvirhe, yritetään uudelleen."
     success: "Maksu onnistui. Kiitos!"

-#  loading_error:
-#    could_not_load: "Error loading from server"
-#    connection_failure: "Connection failed."
-#    unauthorized: "You need to be signed in. Do you have cookies disabled?"
-#    forbidden: "You do not have the permissions."
-#    not_found: "Not found."
-#    not_allowed: "Method not allowed."
-#    timeout: "Server timeout."
-#    conflict: "Resource conflict."
-#    bad_input: "Bad input."
-#    server_error: "Server error."
-#    unknown: "Unknown error."
+  loading_error:
+    could_not_load: "Virhe ladattaessa tietoja palvelimelta"
+    connection_failure: "Yhteysvirhe."
+    unauthorized: "Teidän tulee olla kirjautuneena sisään. Ovatko evästeet sallittuna?"
+    forbidden: "Ei käyttöoikeuttta."
+    not_found: "Ei löydetty."
+    not_allowed: "Toiminto ei sallittu."
+    timeout: "Toiminto aikakatkaistu."
+    conflict: "Resurssiristiriita."
+    bad_input: "Virheellinen syöte."
+    server_error: "Palvelinvirhe."
+    unknown: "Tuntematon virhe."

 #  resources:
 #    sessions: "Sessions"


Update fr.coffee

Update fr.coffee

--- app/locale/fr.coffee
+++ app/locale/fr.coffee
@@ -1027,7 +1027,7 @@
 #    weeding_blurb: "Every player that we list has been screened for technical ability. We also perform phone screens for select candidates and make notes on their profiles to save you time."
 #    pass_screen: "They will pass your technical screen."
 #    pass_screen_blurb: "Review each candidate's code before reaching out. One employer found that 5x as many of our devs passed their technical screen than hiring from Hacker News."
-    make_hiring_easier: "Faire mon embauche plus facile, se il vous plaît."
+    make_hiring_easier: "Faire de mon embauche plus facile, s'il vous plaît."
     what: "Qu'est-ce que CodeCombat?"
     what_blurb: "CodeCombat est un jeu de programmation multijoueur par navigateur. Les Joueurs écrivent le code pour contrôler leurs troupes dans des batailles contre d'autres développeurs. Nous prenons en charge JavaScript, Python, Lua, Clojure, CoffeeScript, et Io."
 #    cost: "How much do we charge?"


FR Translations and corrections

FR Translations and corrections

Categories Translated :
- contact
- classes

Corrections :
(Note aux français) : Il faut différencier les "Subscribe" des "Sign Up". Subscribe équivaut à l'abonnement payant !
- legal > page-title

ATTENTION :
- (417) parent_button : The translation is out of box, text size need to be reduced to around 21px to fit.

--- app/locale/fr.coffee
+++ app/locale/fr.coffee
@@ -393,7 +393,7 @@
     prompt_body: "En voulez-vous plus?"
     prompt_button: "Entrer dans la boutique"
     recovered: "Gemmes précédemment achetées récupérées. Merci de rafraîchir la page."
-#    or_subscribe: "Or 3500 gems/mo if you..."
+    or_subscribe: "Ou 3500 gemmes/mois si vous prenez un..."

   subscribe:
     comparison_blurb: "Eguisez vos compétences avec un abonnement CodeCombat !"
@@ -405,7 +405,7 @@
     feature6: "Assitance par mail dédiée"
     free: "Gratuit"
     month: "mois"
-    subscribe_title: "Inscription"
+    subscribe_title: "Abonnement"
     unsubscribe: "Désinscription"
     confirm_unsubscribe: "Confirmer la désinscription"
 #    never_mind: "Never Mind, I Still Love You"
@@ -414,7 +414,7 @@
     thank_you: "Merci de supporter CodeCombat."
 #    sorry_to_see_you_go: "Sorry to see you go! Please let us know what we could have done better."
     unsubscribe_feedback_placeholder: "Nom de zeus, qu'avons nous fait ?"
-    parent_button: "Demande à tes parents"
+    parent_button: "Demande à tes parents" # The size of the text need to be resized to fit the box (5 letters are out)
     parent_email_description: "Nous leur enverrons un e-mail pour qu'ils t'achetent un abonnement CodeCombat."
     parent_email_input_invalid: "Adresse e-mail non valide"
     parent_email_input_label: "Adresse e-mail des parents"
@@ -589,11 +589,11 @@
     forum_suffix: " À la place."
     faq_prefix: "Il y a aussi une"
     faq: "FAQ"
-#    subscribe_prefix: "If you need help figuring out a level, please"
-    subscribe: "acheter un abonnement CodeCombat"
-#    subscribe_suffix: "and we'll be happy to help you with your code."
-#    subscriber_support: "Since you're a CodeCombat subscriber, your email will get our priority support."
-#    screenshot_included: "Screenshot included."
+    subscribe_prefix: "Si vous avez besoin d'aide pour la résolution d'un niveau"
+    subscribe: "achetez un abonnement CodeCombat"
+    subscribe_suffix: "et nous seront ravis de vous aider avec votre code."
+    subscriber_support: "Etant donné que vous êtes abonné à CodeCombat, votre message sera traité en priorité par notre support."
+    screenshot_included: "Capture d'écran ajoutée."
     where_reply: "Où devons-nous répondre?"
     send: "Envoyer un commentaire"
     contact_candidate: "Contacter le candidat" # Deprecated
@@ -679,22 +679,22 @@
   classes:
     archmage_title: "Archimage"
     archmage_title_description: "(Développeur)"
-#    archmage_summary: "If you are a developer interested in coding educational games, become an archmage to help us build CodeCombat!"
+    archmage_summary: "Si vous êtes développeur intéréssé par le développement de jeux éducatifs, devenez un Archimage et aidez nous à contruire CodeCombat !"
     artisan_title: "Artisan"
     artisan_title_description: "(Créateur de niveau)"
-#    artisan_summary: "Build and share levels for you and your friends to play. Become an Artisan to learn the art of teaching others to program."
+    artisan_summary: "Créez et partagez des niveaux pour y jouer avec vos amis. Devenz un Artisan pour apprendre l'art d'enseigner la programmation."
     adventurer_title: "Aventurier"
     adventurer_title_description: "(Testeur de niveau)"
-#    adventurer_summary: "Get our new levels (even our subscriber content) for free one week early and help us work out bugs before our public release."
+    adventurer_summary: "Jouez aux derniers niveaux (même ceux reservés aux abonnés) une semaine en avance gratuitement, et aidez nous à déceler les bugs avant la sortie publique."
     scribe_title: "Scribe"
     scribe_title_description: "(Rédacteur d'articles)"
-#    scribe_summary: "Good code needs good documentation. Write, edit, and improve the docs read by millions of players across the globe."
+    scribe_summary: "Un bon code nécéssite une bonne documentation. Ecrivez, Corrigez et améliorez la documentation lue par des millions de joueurs autour du monde."
     diplomat_title: "Diplomate"
     diplomat_title_description: "(Traducteur)"
-#    diplomat_summary: "CodeCombat is localized in 45+ languages by our Diplomats. Help us out and contribute translations."
+    diplomat_summary: "CodeCombat est traduit dans plus de 45 langues par nos Diplomates. Aidez nous, et contribuez à ces traductions."
     ambassador_title: "Ambassadeur"
     ambassador_title_description: "(Aide)"
-#    ambassador_summary: "Tame our forum users and provide direction for those with questions. Our ambassadors represent CodeCombat to the world."
+    ambassador_summary: "Domptez les membres du forum, et guidez ceux qui ont besoin d'aide. Nos ambassadeurs représentent CodeCombat face au monde."

   editor:
     main_title: "Éditeurs CodeCombat"
@@ -1039,7 +1039,7 @@
     multiplayer_sign_in_leaderboard: "Connectez-vous ou créez un compte et obtenez votre solution sur le classement."

   legal:
-    page_title: "Légal"
+    page_title: "Mentions légales"
     opensource_intro: "CodeCombat est complètement gratuit et open source."
     opensource_description_prefix: "Regardez "
     github_url: "notre GitHub"


Upsate /// Translate

Upsate /// Translate

Enjoy

--- app/locale/fr.coffee
+++ app/locale/fr.coffee
@@ -193,13 +193,13 @@
     view_profile: "Voir votre profil"

   account_profile:
-#    settings: "Settings"
-#    edit_profile: "Edit Profile"
-#    done_editing: "Done Editing"
+    settings: "Paramètres"
+    edit_profile: "Editer Profil"
+    done_editing: "Modifications effectué"
     profile_for_prefix: "Profil pour "
     profile_for_suffix: ""
-#    featured: "Featured"
-#    not_featured: "Not Featured"
+    featured: "Complet"
+    not_featured: "Incomplet"
     looking_for: "à la recherche de:"
     last_updated: "Dernière Mise à jour:"
     contact: "Contact"
@@ -220,7 +220,7 @@
     next_photo: "ajouter une photo professionelle (optionnel)."
     next_active: "déclarez vous ouvert aux offres pour apparaitre dans les recherches."
     example_blog: "Votre blog"
-#    example_personal_site: "Personal Site"
+    example_personal_site: "Site Web"
     links_header: "Liens personnels"
     links_blurb: "Lien vers d'autres sites ou profils que vous souhaitez mettre en avant, comme votre GitHub, LinkedIn ou votre blog."
     links_name: "Nom du lien"
@@ -448,7 +448,7 @@
     av_entities_sub_title: "Entités"
     av_entities_users_url: "Utilisateurs"
     av_entities_active_instances_url: "Instances actives"
-#    av_entities_employer_list_url: "Employer List"
+    av_entities_employer_list_url: "Liste des employés"
     av_other_sub_title: "Autre"
     av_other_debug_base_url: "Base (pour debugger base.jade)"
     u_title: "Liste des utilisateurs"
@@ -653,7 +653,7 @@
     introduction_desc_ending: "Nous espérons que vous allez joindre notre aventure!"
     introduction_desc_signature: "- Nick, George, Scott, Michael, Jeremy et Glen"
     alert_account_message_intro: "Et tiens!"
-#    alert_account_message: "To subscribe for class emails, you'll need to be logged in first."
+    alert_account_message: "Pour souscrire aux e-mails, vous devez être connecté"
 #    archmage_summary: "Interested in working on game graphics, user interface design, database and server organization, multiplayer networking, physics, sound, or game engine performance? Want to help build a game to help other people learn what you are good at? We have a lot to do and if you are an experienced programmer and want to develop for CodeCombat, this class is for you. We would love your help building the best programming game ever."
     archmage_introduction: "L'une des meilleures parties de la création d'un jeu est qu'il regroupe tant de choses différentes. Graphismes, sons, réseau en temps réel, réseaux sociaux, et bien sur bien d'autres aspects de la programmation, de la gestion bas niveau de base de données, et de l'administration de serveur à l'élaboration d'interfaces utilisateur. Il y a tant à faire, et si vous êtes un programmeur expérimenté avec une aspiration à vraiment plonger dans le fond de CodeCombat, cette classe est faite pour vous. Nous aimerions avoir votre aide pour le meilleur jeu de développement de tous les temps."
     class_attributes: "Attributs de classe"
@@ -860,7 +860,7 @@
 #    facebook_friend_sessions: "Facebook Friend Sessions"
 #    gplus_friends: "G+ Friends"
 #    gplus_friend_sessions: "G+ Friend Sessions"
-#    leaderboard: "Leaderboard"
+    leaderboard: "Classement"
 #    user_schema: "User Schema"
 #    user_profile: "User Profile"
     patches: "Patchs"


revert set class name logic

revert set class name 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/dennis-best/jq-selected.git/'


Test: IDE: Folder: Move to folder tests.

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

--- client/test/lib/ide/folder.coffee
+++ client/test/lib/ide/folder.coffee
@@ -0,0 +1,45 @@
+helpers    = require '../helpers/helpers.js'
+ideHelpers = require '../helpers/idehelpers.js'
+
+module.exports =
+
+
+  createFolderFromMachineHeader: (browser) ->
+
+    user = helpers.beginTest(browser)
+    helpers.waitForVMRunning(browser)
+    helpers.createFolder(browser, user)
+    browser.end()
+
+
+  saveFileToFolder: (browser) ->
+
+    user = helpers.beginTest(browser)
+    helpers.waitForVMRunning(browser)
+    folderData = helpers.createFolder(browser, user)
+
+    helpers.createFile(browser, user, 'li.new-file', folderData.name)
+
+
+   createFolderFromContextMenu: (browser) ->
+
+    user = helpers.beginTest(browser)
+    helpers.waitForVMRunning(browser)
+    helpers.createFile(browser, user, 'li.new-folder')
+    browser.end()
+
+
+  deleteFolder: (browser) ->
+
+    user = helpers.beginTest(browser)
+
+    helpers.waitForVMRunning(browser)
+
+    folderData = helpers.createFolder(browser, user)
+    webPath    = '/home/' + user.username
+    selector   = "span[title='" + webPath + '/' + folderData.name + "']"
+
+    helpers.deleteFile(browser, folderData.selector)
+    browser.end()
+
+


Updating

Updating

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

--- snippets.cson
+++ snippets.cson
@@ -0,0 +1,21 @@
+# 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


Fix select-list auto-scrolling specs

Fix select-list auto-scrolling specs

--- spec/app/select-list-spec.coffee
+++ spec/app/select-list-spec.coffee
@@ -113,7 +113,7 @@

       miniEditor.trigger 'core:move-up'
       miniEditor.trigger 'core:move-up'
-      expect(list.scrollBottom()).toBe itemHeight * 3
+      expect(list.scrollTop()).toBe itemHeight

   describe "the core:confirm event", ->
     describe "when there is an item selected (because the list in not empty)", ->


Addee fixtures [#64155952]

Addee fixtures [#64155952]

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


More fixes for geoip stuff.

More fixes for geoip stuff.

--- server_setup.coffee
+++ server_setup.coffee
@@ -84,7 +84,7 @@
     speaksChinese = firstLanguage and firstLanguage.indexOf('zh') isnt -1
     unless config.tokyo
       ip = req.headers['x-forwarded-for'] or req.connection.remoteAddress
-      ip = ip?.split(' ')[0]  # If there are two IP addresses, say because of CloudFlare, we just take the first.
+      ip = ip?.split(/,? /)[0]  # If there are two IP addresses, say because of CloudFlare, we just take the first.
       geo = geoip.lookup(ip)
       if speaksChinese or geo?.country is "CN"
         log.info("Should we redirect to Tokyo server? speaksChinese: #{speaksChinese}, firstLanguage: #{firstLanguage}, ip: #{ip}, geo: #{geo} -- so redirecting? #{geo?.country is 'CN' and speaksChinese}")


Add flat theme coffee file (same as future)

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

--- src/coffee/messenger-theme-flat.coffee
+++ src/coffee/messenger-theme-flat.coffee
@@ -0,0 +1,23 @@
+$ = jQuery
+
+spinner_template = '''
+

+
+
+
+
+
+
+

+'''
+
+class FlatMessage extends window.Messenger.Message
+    template: (opts) ->
+        $message = super
+
+        $message.append $ spinner_template
+
+        $message
+
+window.Messenger.themes.flat =
+    Message: FlatMessage


Revert "add test for disabling check button while clicking save"

This reverts commit bc6caea6a682781e350e49cc00dc568e639dde13.

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


Bug fix for #214.

Bug fix for #214.

https://edx.lighthouseapp.com/projects/102637-studio/tickets/214-Via-Tender-Numerical-Input-answer-0-a-tolerance-is-not-accepted#ticket-214-4


Rename createAtomWindow to open

Rename createAtomWindow to open

--- src/main.coffee
+++ src/main.coffee
@@ -36,9 +36,9 @@
   atomApplication = new AtomApplication(resourcePath)

   if pathsToOpen.length > 0
-    atomApplication.createAtomWindow(path) for path in pathsToOpen
+    atomApplication.open(path) for path in pathsToOpen
   else
-    atomApplication.createAtomWindow()
+    atomApplication.open()

 delegate.browserMainParts.preMainMessageLoopRun = bootstrapApplication

@@ -128,15 +128,15 @@
     ipc.on 'open-folder', =>
       currentWindow = BrowserWindow.getFocusedWindow()
       paths = dialog.showOpenDialog title: 'Open', properties: ['openFile', 'openDirectory', 'multiSelections', 'createDirectory']
-      @createAtomWindow(path) for path in paths if paths?
+      @open(path) for path in paths if paths?

     ipc.on 'new-window', =>
-      @createAtomWindow()
+      @open()

   sendCommand: (command) ->
     atomWindow.sendCommand command for atomWindow in @windows when atomWindow.browserWindow.isFocused()

-  createAtomWindow: (path) ->
+  open: (path) ->
     new AtomWindow
       path: path
       bootstrapScript: 'window-bootstrap',


Assign globals to snapshotResult only if present

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


performance fix

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


minor

minor


cooldown finilazation

cooldown finilazation

--- src/cooldown.coffee
+++ src/cooldown.coffee
@@ -3,7 +3,7 @@
 GameObject's properties.

-# Health reg
+# Health regeneration
 player = GameObject
   health: 50


removed agenda [deploy: production]

removed agenda [deploy: production]

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


code format update

code format update

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/vn09/rental-helper.git/'


Add default empty message for undefined state message.

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


client: remove isMyPost util

client: remove isMyPost util

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

--- client/app/lib/util/isMyPost.coffee
+++ client/app/lib/util/isMyPost.coffee
@@ -1,6 +0,0 @@
-whoami = require './whoami'
-
-module.exports = (post) ->
-  post         or= {}
-  post.account or= {}
-  post.account._id is whoami().getId() and post.typeConstant not in ['join', 'leave']


better function exporting

better function exporting

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


Open commit in new window

Open commit in new window

[#97184290]


Add plist permission test

Add plist permission test

--- test/cli/commands/start.coffee
+++ test/cli/commands/start.coffee
@@ -16,5 +16,6 @@
   it 'should put a katon.plist in config.launchAgentsPath', ->
     assert test '-e', "#{config.launchAgentsPath}/katon.plist"

-  it 'should set the correct permissions on the katon.plist file'
-    # pending test+  it 'should set the correct permissions on the katon.plist file', ->
+    assert.equal fs.statSync("#{config.launchAgentsPath}/katon.plist").mode,
+      33188


fix(grunt): css not minified if `config.cfg.base` defined

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -13,7 +13,7 @@
       cfg: grunt.file.readYAML("_config.yml")
       pkg: grunt.file.readJSON("package.json")
       app: "<%= config.cfg.source %>"
-      dist: "<%= config.cfg.destination %>"
+      dist: "<%= config.cfg.destination %><%= config.cfg.base %>"
       base: "<%= config.cfg.base %>"
       banner: do ->
         banner = "<!--\n"
@@ -242,7 +242,7 @@
       dist:
         options:
           config: "_config.yml"
-          dest: "<%= config.dist %>/<%= config.base %>"
+          dest: "<%= config.dist %>"

     shell:
       options:


Update when Grunt documentation task runs

No need to run when files changed. It can run when we publish the docs.

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -147,7 +147,6 @@
         files: '{src,test}/**/*.coffee'
         tasks: [
           'newer:coffee'
-          'citare-scriptum'
           'coffeelint'
           'blanket_mocha:test'
         ]
@@ -162,7 +161,7 @@

   # Create aliased tasks.
   grunt.registerTask('default', ['build', 'coffeelint', 'test', 'concurrent'])
-  grunt.registerTask('docs', ['gh-pages:docs'])
+  grunt.registerTask('docs', ['citare-scriptum', 'gh-pages:docs'])
   grunt.registerTask('test', ['blanket_mocha:test'])
   grunt.registerTask('test:ci', ['compile', 'copy', 'blanket_mocha:ci'])


Fix the over creation of AudioContexts when record audio message.

--- packages/rocketchat-ui/lib/recorderjs/audioRecorder.coffee
+++ packages/rocketchat-ui/lib/recorderjs/audioRecorder.coffee
@@ -4,7 +4,7 @@
 		navigator.getUserMedia = navigator.getUserMedia or navigator.webkitGetUserMedia
 		window.URL = window.URL or window.webkitURL

-		@audio_context = new AudioContext
+		window.audioContext = new AudioContext

 		ok = (stream) =>
 			@startUserMedia(stream)
@@ -18,7 +18,7 @@

 	startUserMedia: (stream) ->
 		@stream = stream
-		input = @audio_context.createMediaStreamSource(stream)
+		input = window.audioContext.createMediaStreamSource(stream)
 		@recorder = new Recorder(input, {workerPath: '/recorderWorker.js'})
 		@recorder.record()

@@ -32,9 +32,10 @@

 		@recorder.clear()

-		delete @audio_context
+		window.audioContext.close()
+		delete window.audioContext
 		delete @recorder
 		delete @stream

 	getBlob: (cb) ->
-		@recorder.exportWAV cb+		@recorder.exportWAV cb


fix update task

fix update task

--- app/templates/gulp/tasks/update.coffee
+++ app/templates/gulp/tasks/update.coffee
@@ -1,4 +1,4 @@
 gulp         = require "gulp"
 exec         = require("child_process").exec

-gulp.task 'updateDeps', exec('ncu -u')
+gulp.task 'updateDeps', () -> exec('ncu -u')


Check isEnabledForURL on hash change.

Check isEnabledForURL on hash change.

If an exclusion rule depends on the hash/anchor, then we're not picking
it up.  Here's a concrete example of this:

   - https?://ca*.computing.dcu.ie/[0-9]*-*#*

(which matches slides prepared via "slidy").  The initial URL does not
include the anchor/hash, so we miss the exclusion rule.  The page is
bounced immediately to an anchor/hash for which the rule should apply,
and we miss it.

(There may be other ways in which the URL can change (WebNavigation?),
we need to look into this.)

--- content_scripts/vimium_frontend.coffee
+++ content_scripts/vimium_frontend.coffee
@@ -223,9 +223,10 @@
     chrome.runtime.sendMessage handler: "frameFocused", frameId: frameId, url: window.location.toString()
     checkIfEnabledForUrl()

-# We install this listener directly (that is, we don't use installListener) because we still need to receive
+# We install these listeners directly (that is, we don't use installListener) because we still need to receive
 # events when Vimium is not enabled.
 window.addEventListener "focus", onFocus
+window.addEventListener "hashchange", onFocus

 #
 # Initialization tasks that must wait for the document to be ready.


:lipstick:

:lipstick:

--- spec/app/package-config-panel-spec.coffee
+++ spec/app/package-config-panel-spec.coffee
@@ -10,7 +10,7 @@
     configObserver.reset()
     panel = new PackageConfigPanel

-  it "lists all available packages, with an unchecked checkbox next to packages in the core.disabledPackages array", ->
+  it "lists all installed packages, with an unchecked checkbox next to packages in the core.disabledPackages array", ->
     treeViewTr = panel.installed.packageTableBody.find("tr[name='tree-view']")
     expect(treeViewTr).toExist()
     expect(treeViewTr.find("input[type='checkbox']").attr('checked')).toBeTruthy()


time slider wee kto start on monday

time slider wee kto start on monday

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


Disable sending userlist whisper

Disable sending userlist whisper

remote: Repository unavailable due to DMCA takedown.
remote: See the takedown notice for more details:
remote:   https://github.com/github/dmca/blob/master/2018/2018-09-28-TeraPC.md.
fatal: unable to access 'https://github.com/meishuu/tera-discord-relay.git/': The requested URL returned error: 403


travis debug

travis debug

--- test/helpers.coffee
+++ test/helpers.coffee
@@ -18,6 +18,7 @@
 # will create @app in context
 # usage : before helpers.init port
 _init = (ctx, port, done) ->
+    console.log process.env
     params = name: 'Cozy Home', port: port
     americano.start params, (app, server) =>
         app.server = server


auth for creating user

auth for creating user

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


Update names.coffee

Update names.coffee

--- app/lib/world/names.coffee
+++ app/lib/world/names.coffee
@@ -73,7 +73,6 @@
     'Natasha'
     'Aphrodite'
     'Gabrielle'
-
   ]
   'Peasant M': [
     'Yorik'


matchmedia on animate - disable for small screen

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/Bit-Bahia/bitbahia-rails.git/'


Allow courseware to navigate to specific tabs of a sequence


Don't persist dev/safe/api-preview mode settings of windows

--- src/browser/atom-application.coffee
+++ src/browser/atom-application.coffee
@@ -424,12 +424,7 @@
     for window in @windows
       if loadSettings = window.getLoadSettings()
         unless loadSettings.isSpec
-          states.push(_.pick(loadSettings,
-            'initialPaths'
-            'devMode'
-            'safeMode'
-            'apiPreviewMode'
-          ))
+          states.push(initialPaths: loadSettings.initialPaths)
     @storageFolder.store('application.json', states)

   loadState: ->
@@ -438,9 +433,9 @@
         @openWithOptions({
           pathsToOpen: state.initialPaths
           urlsToOpen: []
-          devMode: state.devMode
-          safeMode: state.safeMode
-          apiPreviewMode: state.apiPreviewMode
+          devMode: @devMode
+          safeMode: @safeMode
+          apiPreviewMode: @apiPreviewMode
         })
       true
     else


Add editor.normalizeIndentOnPaste to the config panel

--- src/app/editor-config-panel.coffee
+++ src/app/editor-config-panel.coffee
@@ -37,6 +37,12 @@

           @div class: 'controls', =>
             @div class: 'checkbox', =>
+              @label for: 'editor.normalizeIndentOnPaste', =>
+                @input id: 'editor.normalizeIndentOnPaste', type: 'checkbox'
+                @text 'Normalize Indent on Paste'
+
+          @div class: 'controls', =>
+            @div class: 'checkbox', =>
               @label for: 'editor.showLineNumbers', =>
                 @input id: 'editor.showLineNumbers', type: 'checkbox'
                 @text 'Show Line Numbers'


testing commit

testing commit

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


Removed fade on touch response for digit symbol task

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


Return false from FileFinder click handler to prevent loss of focus

--- src/extensions/fuzzy-finder.coffee
+++ src/extensions/fuzzy-finder.coffee
@@ -88,6 +88,10 @@
   select: ->
     @open(@findSelectedLi().text())

+  entryClicked: (e) ->
+    @open($(e.currentTarget).text())
+    false
+
   moveUp: ->
     @findSelectedLi()
       .filter(':not(:first-child)')
@@ -104,6 +108,3 @@

   findMatches: (query) ->
     fuzzyFilter(@paths, query, maxResults: @maxResults)
-
-  entryClicked: (e) ->
-    @open($(e.currentTarget).text())


tidy and fix

tidy and fix

--- views/components/main/parts/miniship.cjsx
+++ views/components/main/parts/miniship.cjsx
@@ -84,26 +84,32 @@

 getStatusStyle = (status) ->
   if status?
-    flag = status[0] or status[1] # retreat or repairing
+    flag = status == 0 or status == 1 # retreat or repairing
     if flag? and flag
       return {opacity: 0.4}
   else
     return {}

-getStatusArray = (shipId) ->
-  status = []
+getShipStatus = (shipId) ->
+  status = -1
   # retreat status
-  status[0] = shipId == escapeId || shipId == towId
+  if shipId == escapeId || shipId == towId
+    return status = 0
   # reparing
-  status[1] = if shipId in _ndocks then true else false
+  if shipId in _ndocks
+    return status = 1
   # special 1 locked phase 1
-  status[2] = _ships[shipId].api_sally_area == 1
+  else if _ships[shipId].api_sally_area == 1
+    return status = 2
   # special 2 locked phase 2
-  status[3] = _ships[shipId].api_sally_area == 2
+  else if _ships[shipId].api_sally_area == 2
+    return status = 3
   # special 3 locked phase 3
-  status[4] =  _ships[shipId].api_sally_area == 3
+  else if  _ships[shipId].api_sally_area == 3
+    return status = 4
   # special 3 locked phase 3
-  status[5] = _ships[shipId].api_sally_area == 4
+  else if _ships[shipId].api_sally_area == 4
+    return status = 5
   return status

 ###
@@ -120,23 +126,22 @@
     else if @props.status[4]? and @props.status[4]
       <FontAwesome key={0} name='rub' />

-    @todo: improve extesibility
 ###
 StatusLabelMini = React.createClass
   shouldComponentUpdate: (nextProps, nextState) ->
     not _.isEqual(nextProps.label, @props.label)
   render: ->
-    if @props.label[0]? and @props.label[0]
+    if @props.label? and @props.label == 0
       <FontAwesome key={0} name='exclamation-circle' />
-    else if @props.label[1]? and @props.label[1]
+    else if @props.label? and @props.label == 1
       <FontAwesome key={0} name='wrench' />
-    else if @props.label[2]? and @props.label[2]
+    else if @props.label? and @props.label == 2
       <FontAwesome key={0} name='lock' />
-    else if @props.label[3]? and @props.label[3]
+    else if @props.label? and @props.label == 3
       <FontAwesome key={0} name='lock' />
-    else if @props.label[4]? and @props.label[4]
+    else if @props.label? and @props.label == 4
       <FontAwesome key={0} name='lock' />
-    else if @props.label[4]? and @props.label[4]
+    else if @props.label? and @props.label == 5
       <FontAwesome key={0} name='lock' />
     else

@@ -276,19 +281,14 @@
   condDynamicUpdateFlag: false
   getInitialState: ->
     cond: [0, 0, 0, 0, 0, 0]
-    label: [[false, false, false, false, false, false],
-            [false, false, false, false, false, false],
-            [false, false, false, false, false, false],
-            [false, false, false, false, false, false],
-            [false, false, false, false, false, false],
-            [false, false, false, false, false, false]]
+    label: [-1, -1, -1, -1, -1, -1]
   updateLabels: ->
     # refresh label
     {label} = @state
     for shipId, j in @props.deck.api_ship
       continue if shipId == -1
       ship = _ships[shipId]
-      status = getStatusArray shipId
+      status = getShipStatus shipId
       label[j] = status
     label
   onCondChange: (cond) ->
@@ -302,17 +302,18 @@
     switch path
       when '/kcsapi/api_port/port'
         updateflag = true
+        label = @updateLabels()
       when '/kcsapi/api_req_hensei/change'
         updateflag = true
+        label = @updateLabels()
       when '/kcsapi/api_req_nyukyo/start'
         shipId = parseInt postBody.api_ship_id
         if shipId in @props.deck.api_ship
           i = @props.deck.api_ship.indexOf shipId
-          # status = getStatusArray shipId
-          label[i][1] = true
+          # status = getShipStatus shipId
+          label[i] = 1
           updateflag = true
     if updateflag
-      label = @updateLabels()
       @setState
         label: label
   shouldComponentUpdate: (nextProps, nextState) ->
@@ -371,7 +372,6 @@
           ship = _ships[shipId]
           shipInfo = $ships[ship.api_ship_id]
           shipType = $shipTypes[shipInfo.api_stype].api_name
-

             <OverlayTrigger placement="top" overlay={
               <Popover className="ship-pop">


minor fixes

minor fixes

--- views/components/main/parts/miniship.cjsx
+++ views/components/main/parts/miniship.cjsx
@@ -93,17 +93,17 @@
 getStatusArray = (shipId) ->
   status = []
   # retreat status
-  status[0] = if shipId == escapeId || shipId == towId then true else false
+  status[0] = shipId == escapeId || shipId == towId
   # reparing
   status[1] = if shipId in _ndocks then true else false
   # special 1 locked phase 1
-  status[2] = if _ships[shipId].api_sally_area == 1 then true else false
+  status[2] = _ships[shipId].api_sally_area == 1
   # special 2 locked phase 2
-  status[3] = if _ships[shipId].api_sally_area == 2 then true else false
+  status[3] = _ships[shipId].api_sally_area == 2
   # special 3 locked phase 3
-  status[4] = if _ships[shipId].api_sally_area == 3 then true else false
+  status[4] =  _ships[shipId].api_sally_area == 3
   # special 3 locked phase 3
-  status[5] = if _ships[shipId].api_sally_area == 4 then true else false
+  status[5] = _ships[shipId].api_sally_area == 4
   return status

 ###
@@ -139,7 +139,7 @@
     else if @props.label[4]? and @props.label[4]
       <FontAwesome key={0} name='lock' />
     else
-
+

 getFontStyle = (theme)  ->
   if window.isDarkTheme then color: '#FFF' else color: '#000'


Added Steam (Dota 2) script, powered by Steam Web API

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

--- steam.coffee
+++ steam.coffee
@@ -0,0 +1,82 @@
+# Description:
+#   Steam Web API (Dota 2)
+#
+# Dependencies:
+#   "moment": "^2.5.1"
+#
+# Configuration:
+#   STEAM_API_KEY
+#
+# Commands:
+#   hubot steam id [me] <custom URL> - Returns the Steam ID for the user under http://steamcommunity.com/id/<custom URL>
+#   hubot dota history <Steam ID> - Returns metadata for the latest 5 game lobbies with <Steam ID>
+#   hubot dota match <match ID> - Returns information about a particular <match ID>
+#
+# Author:
+#   MrSaints
+
+version = '0001'
+
+moment = require 'moment'
+
+heroes = require '../data/heroes'
+lobbies =
+    "-1": "Invalid"
+    0: "Public matchmaking"
+    1: "Practice"
+    2: "Tournament"
+    3: "Tutorial"
+    4: "Co-op with bots"
+    5: "Team match"
+    6: "Solo queue"
+
+module.exports = (robot) ->
+    robot.respond /steam id( me)? (.*)/i, (msg) ->
+        steam_request msg, "/ISteamUser/ResolveVanityURL", vanityurl: msg.match[2], (object) ->
+            if object.response.success is 1
+                msg.match[2] += if msg.match[2].slice(-1) is "s" then "'" else "'s"
+                msg.reply "#{msg.match[2]} Steam ID is: #{object.response.steamid}"
+                return
+
+            msg.reply "The custom URL you have entered (\"#{msg.match[2]}\") does not exist."
+
+    robot.respond /dota history (.*)/i, (msg) ->
+        communityID = getCommunityID(msg.match[1])
+        steam_request msg, "/IDOTA2Match_570/GetMatchHistory", { account_id: communityID, matches_requested: 5 }, (object) ->
+            if object.result.status is 15
+                msg.reply "The Steam ID you have entered (\"#{msg.match[1]}\") does not have match history enabled."
+                return
+            else if object.result.num_results is 0
+                msg.reply "No game matches were found for the Steam ID: #{msg.match[1]}."
+                return
+
+            for match in object.result.matches
+                hero = "N/A"
+                start = moment.unix(match.start_time).fromNow()
+
+                for player in match.players
+                    if player.account_id is communityID
+                        hero = getHero player.hero_id
+                        break;
+
+                msg.send "Match ID: #{match.match_id} | Lobby: #{lobbies[match.lobby_type]} | Hero: #{hero.localized_name} | #{start}"
+
+getCommunityID = (steamID) ->
+    (steamID - 76561197960265728)
+
+getHero = (heroID) ->
+    return hero for hero in heroes when hero.id is heroID
+
+steam_request = (msg, endpoint, params = {}, handler) ->
+    params.key = process.env.STEAM_API_KEY
+
+    msg.http("http://api.steampowered.com#{endpoint}/v#{version}/")
+        .query(params)
+        .get() (err, res, body) ->
+            if err or res.statusCode isnt 200
+                err = "Bad request (invalid Steam web API key)" if res.statusCode is 400
+                msg.reply "An error occurred while attempting to process your request: #{err}"
+                return
+
+            handler JSON.parse(body)
+


New Javascript Calculator Implementation

--- javascripts/lib.coffee
+++ javascripts/lib.coffee
@@ -0,0 +1,8 @@
+window.ttm ||= {}
+
+ttm.ClassMixer = (klass)->
+  klass.build = ->
+    it = new klass
+    it.initialize && it.initialize.apply(it, arguments)
+    it
+  klass


Fixed archive box html

Fixed archive box html

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


Contact autocomplete start when > 2c refs #53

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


and start on the selected image

and start on the selected image

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


Add taiga variant of $location service with minor changes for avoid reloading.

error: pathspec 'app/coffee/modules/base/location.coffee' did not match any file(s) known to git

--- app/coffee/modules/base/location.coffee
+++ app/coffee/modules/base/location.coffee
@@ -0,0 +1,35 @@
+###
+# Copyright (C) 2014 Andrey Antukh <niwi@niwi.be>
+# Copyright (C) 2014 Jesús Espino Garcia <jespinog@gmail.com>
+# Copyright (C) 2014 David Barragán Merino <bameda@dbarragan.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# File: modules/base/location.coffee
+###
+
+
+locationFactory = ($location, $route, $rootscope) ->
+    $location.noreload =  (scope) ->
+        lastRoute = $route.current
+        un = scope.$on "$locationChangeSuccess", ->
+            $route.current = lastRoute
+            un()
+
+        return $location
+    return $location
+
+
+module = angular.module("taigaBase")
+module.factory("$tgLocation", ["$location", "$route", "$rootScope", locationFactory])


give the `-l` flag to literate

give the `-l` flag to literate

remove `-l` from lint, allowing it to be used for literate

--- src/command.coffee
+++ src/command.coffee
@@ -39,14 +39,14 @@
   ['-h', '--help',            'display this help message']
   ['-i', '--interactive',     'run an interactive CoffeeScript REPL']
   ['-j', '--join [FILE]',     'concatenate the source CoffeeScript before compiling']
-  ['-l', '--lint',            'pipe the compiled JavaScript through JavaScript Lint']
+  [      '--lint',            'pipe the compiled JavaScript through JavaScript Lint']
   ['-m', '--map',             'generate source map and save as .map files']
   ['-n', '--nodes',           'print out the parse tree that the parser produces']
   [      '--nodejs [ARGS]',   'pass options directly to the "node" binary']
   ['-o', '--output [DIR]',    'set the output directory for compiled JavaScript']
   ['-p', '--print',           'print out the compiled JavaScript']
   ['-s', '--stdio',           'listen for and compile scripts over stdio']
-  ['-L', '--literate',        'treat stdio as literate style coffee-script']
+  ['-l', '--literate',        'treat stdio as literate style coffee-script']
   ['-t', '--tokens',          'print out the tokens that the lexer/rewriter produce']
   ['-v', '--version',         'display the version number']
   ['-w', '--watch',           'watch scripts for changes and rerun commands']


fixed behavior of push event subscribe, added ability to add Methods for all Cells, added ability for delete element from ArrayCell

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


Refactor nested if/else

Refactor nested if/else

--- src/helpers.coffee
+++ src/helpers.coffee
@@ -152,8 +152,10 @@
   types.forEach (type) ->
     pluginHelpers = configFiles[type].pluginHelpers
     joinConfig[type].pluginHelpers =
-      if pluginHelpers
-        if Array.isArray(pluginHelpers) then pluginHelpers else [pluginHelpers]
+      if Array.isArray pluginHelpers
+        pluginHelpers
+      else if pluginHelpers
+        [pluginHelpers]
       else
         do ->
           destFiles = Object.keys joinConfig[type]


Do not do fatal error on invalid bower components.

--- src/helpers.coffee
+++ src/helpers.coffee
@@ -283,6 +283,7 @@
   replaceSlashes config if os.platform() is 'win32'
   normalizeConfig config
   readComponents '.', (error, components) ->
+    logger.error error if error
     components ?= []
     config._normalized.components = components
     filesMap = config._normalized.componentsFilesMap = {}


Forgot to add new file :$

Forgot to add new file :$

error: pathspec 'js-library/src/js/util/scrollto.coffee' did not match any file(s) known to git

--- js-library/src/js/util/scrollto.coffee
+++ js-library/src/js/util/scrollto.coffee
@@ -0,0 +1,15 @@
+Factlink.scrollTo = (fact_id) ->
+  $('body')
+    ._scrollable()
+    .scrollTo(
+      "span[data-factid=#{fact_id}]",
+      800,
+      offset:
+        top:-100
+        axis: 'y'
+    )
+
+$(window).bind 'factlink.factsLoaded', ->
+  if Factlink? and FactlinkConfig? and FactlinkConfig.scrollto
+    # Get al the facts on the current page
+    Factlink.scrollTo FactlinkConfig.scrollto


smile

smile

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

--- scripts/smile.coffee
+++ scripts/smile.coffee
@@ -0,0 +1,3 @@
+module.exports = (robot) ->
+  robot.hear /^:\)$/i, (msg) ->
+    msg.send "http://mlkshk.com/r/TH09.gif"


Switching to live iTunes receipt verification URL.

--- server_config.coffee
+++ server_config.coffee
@@ -16,9 +16,10 @@
   host: process.env.COCO_MONGO_HOST or 'localhost'
   db: process.env.COCO_MONGO_DATABASE_NAME or 'coco'
   mongoose_replica_string: process.env.COCO_MONGO_MONGOOSE_REPLICA_STRING or ''
-
+
 config.apple =
-  verifyURL: process.env.COCO_APPLE_VERIFY_URL or 'https://sandbox.itunes.apple.com/verifyReceipt' # 'https://buy.itunes.apple.com/verifyReceipt'
+  #verifyURL: process.env.COCO_APPLE_VERIFY_URL or 'https://sandbox.itunes.apple.com/verifyReceipt'
+  verifyURL: process.env.COCO_APPLE_VERIFY_URL or 'https://buy.itunes.apple.com/verifyReceipt'

 config.redis =
   port: process.env.COCO_REDIS_PORT or 6379


Adding logs for index building

Adding logs for index building

--- lib/services/php-proxy.coffee
+++ lib/services/php-proxy.coffee
@@ -28,7 +28,9 @@

       return res
     else
+      console.log 'Building index'
       exec.exec(config.config.php + " " + __dirname + "/../../php/parser.php " + directory.path + " " + command, (error, stdout, stderr) ->
+        console.log 'Build done'
         return []
       )


fix to req.io.on failing

fix to req.io.on failing

there is no such member named sockets...

--- lib/request.coffee
+++ lib/request.coffee
@@ -1,4 +1,3 @@
-
 RoomIO = require('./room').RoomIO

 class exports.RequestIO
@@ -27,7 +26,7 @@

     on: ->
         args = Array.prototype.slice.call arguments, 0
-        @sockets.on.apply @socket, args
+        @socket.on.apply @socket, args

     disconnect: (callback) ->
         @socket.disconnect(callback)


Filter by state and application member

Filter by state and application member

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


added notDesignDoc filter, for replication (fixes #145)


Update eui-select component for new validation support 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/artsyca/emberui.git/'


fix typo

fix typo

--- lib/japanese-wrap-manager.coffee
+++ lib/japanese-wrap-manager.coffee
@@ -61,7 +61,7 @@
     @halfWidthCharRegexp = /[\u0000-\u036F\u2000-\u2000A\u2122\uD800-\uD83F\uFF61-\uFFDC]/
     # @fullWidthChar = /[^\u0000-\u036F\uFF61-\uFFDC]/

-    # Lin Adjustment by Hanging Punctuation
+    # Line Adjustment by Hanging Punctuation
     @hangingPunctuationCharRegexp = CharacterRegexpUtil.string2regexp(
         JapaneseWrapManager.characterClasses["Full stops"],
         JapaneseWrapManager.characterClasses["Commas"])


started work on the thread server side

started work on the thread server side

error: pathspec 'handlers/thread.iced' did not match any file(s) known to git

--- handlers/thread.iced
+++ handlers/thread.iced
@@ -0,0 +1,40 @@
+
+bhs                   = require 'keybase-http-server'
+{Handler,GET,POST}    = bhs.base
+{api_route}           = require '../lib/urls'
+challenge             = require '../lib/challenge'
+mm                    = bhs.mod.mgr
+{checkers}            = require 'keybase-bjson-core'
+{make_esc}            = require 'iced-error'
+
+#=============================================================================
+
+class InitThreadHandler extends Handler
+
+  input_template : -> {
+    session_id : checkers.buffer(4)   # valid session ID
+    i : checkers.buffer(8)            # the thread ID
+    users : checkers.array(2)         # 2 or more users
+  }
+
+  #----------------
+
+  validate_session : (cb) ->
+    q = "SELECT ctime FROM used_challenge_tokens WHERE token_id = ?"
+    args = [ @input.session_id.toString('hex') ]
+    cb null
+
+  #----------------
+
+  _handle : (cb) ->
+    esc = make_esc cb, "InitThreadHandler::_handle"
+    await @validate_session esc defer()
+    cb err
+
+#=============================================================================
+
+exports.bind_to_app = (app) ->
+  InitThreadHandler.bind app, api_route("thread/init"), GET
+
+#=============================================================================
+


[bot] [fix] increasing limits because i'm cool

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


Update commit model

Update commit model

[#97001584]

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


Correct indentation lint error.

Correct indentation lint error.

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


reorganize code order more logically

reorganize code order more logically


Added data structure to represent digit symbols


added some doc for Widget

added some doc for Widget


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


bug fix

bug fix


reindenting grammar.coffee to the shared column, as much as possible.

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


Prepend “use strict” to wrapped modules by default.

--- src/helpers.coffee
+++ src/helpers.coffee
@@ -243,20 +243,26 @@
     .reduce(listToObj, {})
   Object.freeze(result)

-normalizeWrapper = (typeOrFunction) ->
+indent = (data, strict) ->
+  result = ''
+  result += if strict then "'use strict';\n  " else ""
+  result += data.replace /\n(?!\n)/g, '\n  '
+  result
+
+normalizeWrapper = (typeOrFunction, strict) ->
   switch typeOrFunction
     when 'commonjs'
       (path, data) ->
         """
   window.require.define({#{path}: function(exports, require, module) {
-    #{data.replace(/\n(?!\n)/g, '\n  ')}
+    #{indent data, strict}
   }});\n\n
   """
     when 'amd'
       (path, data) ->
         """
   define(#{path}, ['require', 'exports', 'module'], function(require, exports, module) {
-    #{data.replace(/\n(?!\n)/g, '\n  ')}
+    #{indent data, strict}
   });
   """
     when false then (path, data) -> "#{data}"
@@ -313,6 +319,7 @@
   modules              = config.modules      ?= {}
   modules.wrapper     ?= 'commonjs'
   modules.definition  ?= 'commonjs'
+  modules.strict      ?= yes

   config.server       ?= {}
   config.server.base  ?= ''
@@ -342,9 +349,10 @@
 normalizeConfig = (config) ->
   normalized = {}
   normalized.join = createJoinConfig config.files
+  mod = config.modules
   normalized.modules = {}
-  normalized.modules.wrapper = normalizeWrapper config.modules.wrapper
-  normalized.modules.definition = normalizeDefinition config.modules.definition
+  normalized.modules.wrapper = normalizeWrapper mod.wrapper, mod.strict
+  normalized.modules.definition = normalizeDefinition mod.definition
   normalized.conventions = {}
   Object.keys(config.conventions).forEach (name) ->
     normalized.conventions[name] = normalizeChecker config.conventions[name]


Disable server caching completely in brunch w -s.

--- src/helpers.coffee
+++ src/helpers.coffee
@@ -188,6 +188,9 @@

 startDefaultServer = (port, path, callback) ->
   server = express.createServer()
+  server.use (request, response, next) ->
+    response.header 'Cache-Control', 'no-cache'
+    next()
   server.use express.static path
   server.all '/*', (request, response) ->
     response.sendfile sysPath.join path, 'index.html'


Update es.cson

Update es.cson

--- lib/translations/es.cson
+++ lib/translations/es.cson
@@ -57,6 +57,7 @@
     "title": "Posts"
     "featured": "Destacado"
 "post":
+    "comments": "Comments"
     "openInBrowser": "Abrir en el navegador"
 "about":
     "title": "Acerca de"
@@ -72,6 +73,7 @@
     "es": "Spanish"
     "pl": "Polaco"
     "de": "Alemán"
+    "pt": "Portugués"
 "fontSize":
     "small": "Pequeña"
     "medium": "Mediana"


:lipstick:

:lipstick:

--- src/packages/tabs/lib/tab-view.coffee
+++ src/packages/tabs/lib/tab-view.coffee
@@ -92,8 +92,6 @@
       toPane = $(rootView.find('.pane')[toPaneIndex])
       toEditor = toPane.find('.editor').view()

-      if fromPaneIndex != toPaneIndex
-        return if @containsEditSession(toEditor, fromEditor.editSessions[draggedTab.index()])
-
-      fromEditor.moveEditSessionToEditor(draggedTab.index(), toEditor, droppedNearTab.index() + 1)
-      toEditor.focus()
+      unless @containsEditSession(toEditor, fromEditor.editSessions[draggedTab.index()])
+        fromEditor.moveEditSessionToEditor(draggedTab.index(), toEditor, droppedNearTab.index() + 1)
+        toEditor.focus()


TBCampaign: Use third digit of remaining space in counter.

--- client/Intro/tbcampaignhomepageview.coffee
+++ client/Intro/tbcampaignhomepageview.coffee
@@ -8,7 +8,7 @@

   createDigitsMarkup: ->
     leftInByte = @getData().content.diskSpaceLeftMB * 1024 * 1024
-    leftInTB   = KD.utils.formatBytesToHumanReadable leftInByte
+    leftInTB   = KD.utils.formatBytesToHumanReadable leftInByte, 3
     [left]     = leftInTB.split " "
     left       = "99.99"  if left is "100.00"
     [tb, gb]   = left.split "."
@@ -20,7 +20,7 @@

,

#{gb[0] or 0}

#{gb[1] or 0}

-
9

+
#{gb[2] or 0}

     """

   getDaysLeft: ->


Remove the scrollbar class from commands logged

--- spec/command-logger-spec.coffee
+++ spec/command-logger-spec.coffee
@@ -7,6 +7,9 @@

   dispatch = (command) ->
     atom.commands.dispatch(workspaceElement, command)
+
+  removeScrollbarClass = (str) ->
+    str.replace /\.scrollbars-visible-(when-scrolling|always)/g, ''

   beforeEach ->
     workspaceElement = atom.views.getView(atom.workspace)
@@ -60,9 +63,9 @@
     it 'formats commands with the time, name and source', ->
       atom.commands.dispatch(workspaceElement, 'foo:bar')

-      expect(logger.getText()).toBe """
+      expect(removeScrollbarClass(logger.getText())).toBe """
         ```
-             -0:00.0 foo:bar (atom-workspace.workspace.scrollbars-visible-when-scrolling)
+             -0:00.0 foo:bar (atom-workspace.workspace)
         ```
       """

@@ -71,11 +74,11 @@
       dispatch('foo:second')
       dispatch('foo:third')

-      expect(logger.getText()).toBe """
+      expect(removeScrollbarClass(logger.getText())).toBe """
         ```
-             -0:00.0 foo:first (atom-workspace.workspace.scrollbars-visible-when-scrolling)
-             -0:00.0 foo:second (atom-workspace.workspace.scrollbars-visible-when-scrolling)
-             -0:00.0 foo:third (atom-workspace.workspace.scrollbars-visible-when-scrolling)
+             -0:00.0 foo:first (atom-workspace.workspace)
+             -0:00.0 foo:second (atom-workspace.workspace)
+             -0:00.0 foo:third (atom-workspace.workspace)
         ```
       """

@@ -83,9 +86,9 @@
       dispatch('foo:bar')
       dispatch('foo:bar')

-      expect(logger.getText()).toBe """
+      expect(removeScrollbarClass(logger.getText())).toBe """
         ```
-          2x -0:00.0 foo:bar (atom-workspace.workspace.scrollbars-visible-when-scrolling)
+          2x -0:00.0 foo:bar (atom-workspace.workspace)
         ```
       """

@@ -95,9 +98,9 @@
         time: Date.now()
         title: 'bummer'

-      expect(logger.getText(event)).toBe """
+      expect(removeScrollbarClass(logger.getText(event))).toBe """
         ```
-             -0:00.0 foo:bar (atom-workspace.workspace.scrollbars-visible-when-scrolling)
+             -0:00.0 foo:bar (atom-workspace.workspace)
              -0:00.0 bummer
         ```
       """


annotation now hides automatically on mouseleave events. click to hide/show or re-position the annotation.

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


Initial commit of source code

Initial commit of source code

--- coffeemakefile.coffee
+++ coffeemakefile.coffee
@@ -0,0 +1,290 @@
+# Copyright (c) 2014 Michele Bini
+#
+# This program is available under the terms of the MIT License
+
+module.exports = ((x)-> x.clone())
+  version: "makefile-coffee 0.3.0"
+
+  RegExp: RegExp
+  fs: require 'fs'
+  # cp: require 'child_process'
+  touch: require 'touch'
+  execSync: require 'execSync'
+  setTimeout: setTimeout
+  clearTimeout: clearTimeout
+
+  ruleToRx: (x)->
+    # From Oriol, stackoverflow.com: http://stackoverflow.com/questions/2593637/how-to-escape-regular-expression-in-javascript
+    escaperx = (str)->
+       str.replace /[.^$*+?()[{\\|\]-]/g, '\\$&'
+
+    new @RegExp("^" + escaperx(x).replace("%", "(.*)") + "$")
+
+  maxDepth: 7
+
+  rule: ->
+    args = (x for x in arguments)
+    target = null
+    deps = [ ]
+    task = null
+    opts = { }
+    while args.length
+      x = args.shift()
+      t = typeof x
+      if t is "string"
+        unless target?
+          target = x
+        else
+          deps.push x
+      else if t is "function"
+        task = x
+      else if t is "object"
+        opts[k] = v for k,v of x
+    if /%/.test target
+      @trace "Adding rule for #{target}"
+      @rules.push { target, deps, opts, task, rx: @ruleToRx(target) }
+    else
+      delete @targets[target]
+      @trace "Adding rule for #{target}"
+      @targets[target] = { deps, opts, task }
+    @
+
+  'var': ->
+    args = (x for x in arguments)
+    name = args.shift()
+    delete @vars[name]
+    if args.length > 0
+      @vars[name] = args.join(' ')
+    else
+      @vars[name] = name
+    @
+
+  sh: ->
+    args = (x for x in arguments)
+    cmdparts = []
+    opt = { }
+    for x in args
+      t = typeof x
+      if t is 'string'
+        cmdparts.push x
+      else
+        opt[k] = v for k,v of x
+    cmd = cmdparts.join(' ')
+    if opt.out
+      cmd = cmd + ' >' + opt["out"]
+    if opt.in
+      cmd = cmd + ' <' + opt["in"]
+    @show cmd
+    @execSync.run cmd unless @testRun
+
+  vars: [ ]
+  rules: [ ]
+  targets: { }
+
+  clone: ->
+      y = do ({ rule } = @)-> ->
+        rule.apply y, arguments
+      y[k]=v for k,v of @; y
+      y.vars = @vars.slice(0)
+      y.rules = @rules.slice(0)
+      y.targets  = do (x = { })=> x[k] = v for k,v of @targets;  x
+      y
+
+  process: process
+
+  echo: ->
+    args = [ x for x in arguments ]
+    @process.stdout.write args.join(' ') + "\n"
+    @
+
+  setup: (setup)->
+    setup.apply @
+    @
+
+  error: (msg)->
+    @echo msg
+    @process.exit(1)
+    throw "Could not exit after error: #{msg}"
+
+  assertTrue: (msg, cond)->
+    throw "Internal error: #{msg}" unless cond
+
+  info: (msg)->
+    if @verboseness >= 1
+      @echo msg
+    @
+
+  show: (msg)->
+    if @verboseness >= 0
+      @echo msg
+    @
+
+  trace: (msg)->
+    if @verboseness >= 2
+      @echo msg
+    @
+
+  debug: (msg)->
+    if @verboseness >= 3
+      @echo msg
+    @
+
+  makeNow: (target)->
+    entry = @target[target]
+    @depsRequired or= { }
+    if entry?
+      for dep in entry.deps
+        if @depsRequired[dep]?
+          @info "Ignored circular or duplicate dependency: #{dep}"
+        else
+
+    @
+
+  make: (target)->
+    (@toMake or= {})[target] = 1
+
+  verboseness: 0
+
+  options:
+    watch: (args)-> @action = 'watchAction'
+    verbose: (args)-> @verboseness++
+    quiet: (args)-> @verboseness = -1
+    delay: (args)-> @buildDelay = args.shift()
+    test: (args)-> @testRun = true
+
+  processOption: (name, args)->
+    if (x = @options[name])?
+      x.call @, args
+    else
+      @error "Unrecognized option: --#{name}"
+
+  action: 'buildAction'
+
+  watchAction: ->
+    timeout = null
+    @buildAction() # This should be moved for production
+    @fs.watch '.', (event, filename)=>
+      @trace "Event for #{filename}"
+      if timeout
+        @clearTimeout timeout
+        timeout = null
+      timeout = @setTimeout((=> @buildAction()), @buildDelay)
+    @
+
+  buildAction: ->
+    @targetsChecked = { }
+    @targetsBuilt = { }
+    @tryMake x for x of @toMake
+    @
+
+  fileExists: (x)->
+    @fs.existsSync(x)
+
+  depExists: (x)->
+    # Dependencies that have been built already are assumed to exist!
+    @targetsBuilt[x] or @fileExists(x)
+
+  fileTime: (f)->
+    try
+      s = @fs.statSync(f)
+    catch error
+      return null
+    s.mtime
+
+  depTime: (f)->
+    s = @fs.statSync(f)
+    s.mtime
+
+  isTargetNewer: (target, deps)->
+    return false unless (t = @fileTime target)?
+    @debug "deps: " + target
+    for d in deps
+      @assertTrue "Dependency #{target} doesn't have a time", (tt = @depTime d)?
+      return false if t <= tt
+    @trace "newer"
+    true
+
+  touchFile: (file)->
+    @touch.sync(file) unless @testRun
+
+  tryBuild: (target, deps, task, soft)->
+      @debug "Try to build #{target}"
+      @debug "Complain if some dependencies are missing."
+      for xx in deps
+        unless @depExists(xx)
+          (if soft then @trace else @error).call @, "A required dependency is missing: #{xx}"
+          return
+      # Do nothing if target is newer than all dependencies
+      unless @isTargetNewer(target, deps)
+        # Otherwise build our target
+        @trace "Building target: #{target} with deps #{deps.join(',')}"
+        @dep = deps
+        @in = deps[0]
+        @out = target
+        fileDidExistBefore = @fileExists target
+        try
+          task.apply @
+          @touchFile(target)
+        catch error
+          unless fileDidExistBefore
+            try
+              @fs.unlinkSync(target)
+            catch error
+              true
+          throw error
+
+  tryMake: (x, depth = 0)->
+    depth++
+    return if depth > @maxDepth
+    if @targetsChecked[x]?
+      @trace "#{x} already checked, skipping"
+      return
+    @info "Checking status of #{x}"
+    @targetsChecked[x] = 1
+    if (t = @targets[x])?
+      for xx in t.deps
+        @tryMake xx, depth
+      @tryBuild(x, t.deps, t.task)
+    else
+      @debug "No explicit target found, checking rules for #{x}"
+      for r in @rules
+        if (m = r.rx.exec x)?
+          @trace "Rule #{r.target} <- #{r.deps[0] ? "''"} matches!"
+          deps = (d.replace "%", m[1] for d in r.deps)
+          for xx in deps
+            @tryMake xx, depth
+          @tryBuild(x, deps, r.task, true)
+          @debug "Rule #{r.target} <- #{r.deps[0] ? "''"} matches! DONE"
+
+  performAction: ->
+    unless @toMake?
+      lastTarget = null
+      lastTarget = k for k,v of @targets
+      @error "No targets defined!" unless lastTarget?
+      @make lastTarget
+    @[@action].apply @
+
+  processArgs: (args)->
+    while args.length
+        x = args.shift()
+        if (m = /^--(.*)$/.exec(x))?
+          if m[1] is ''
+            break
+          @processOption m[1], args
+        else
+          @make x
+    while args.length
+        x = args.shift()
+        @make x
+    @
+
+  run: (setup)->
+    { process } = @
+    [ progname, args ] = do->
+      # Extract correct argument list
+      { argv } = process
+      args = if /([/]|^)coffee([.]exe)?$/i.test argv[0] then argv.slice(1) else argv.slice(0)
+      progname = args.shift()
+      [ progname, args ]
+    @v = @vars
+    @processArgs(args).setup(setup).performAction()


[add] Basic stat tracking for Chat

[add] Basic stat tracking for Chat


JStackTemplate: test case for failed to generate stack flow

--- workers/social/lib/social/models/computeproviders/stacktemplate.test.coffee
+++ workers/social/lib/social/models/computeproviders/stacktemplate.test.coffee
@@ -1,5 +1,6 @@
 ComputeProvider = require './computeprovider'
 JStackTemplate = require './stacktemplate'
+JCounter = require '../counter'

 { async
   expect
@@ -273,25 +274,75 @@
           ], done

-    describe 'when team limit has been reached', ->
-
-      it 'should fail to generate a stack from the template', (done) ->
+      it 'should keep limits as is if generating fails', (done) ->

         options       =
           machines    : generateStackMachineData 2
           createGroup : yes

+        options.machines[0].provider = 'nosuchprovider'
+
         withConvertedUserAndStackTemplate options, ({ client, group, stackTemplate }) ->

+          counterOptions =
+            namespace : group.getAt 'slug'
+            type      : ComputeProvider.COUNTER_TYPE.instances
+
           async.series [

             (next) ->
+              JCounter.count counterOptions, (err, count) ->
+                expect(err).to.not.exist
+                expect(count).to.equal 0
+                next()
+
+            (next) ->
+              stackTemplate.generateStack client, {}, (err) ->
+                expect(err.message).to.be.equal 'Stack is not verified yet'
+                next()
+
+            (next) ->
+              config = { verified: yes }
+              stackTemplate.update$ client, { config }, (err) ->
+                expect(err).to.not.exist
+                next()
+
+            (next) ->
+              stackTemplate.generateStack client, {}, (err, res) ->
+                expect(err).to.not.exist
+                expect(res.results.machines[0].err).to.exist
+                expect(res.results.machines[0].obj).to.not.exist
+                expect(res.results.machines[0].err.name).to.equal 'ProviderNotFound'
+                next()
+
+            (next) ->
+              JCounter.count counterOptions, (err, count) ->
+                expect(err).to.not.exist
+                expect(count).to.equal 1
+                next()
+
+          ], done
+
+
+
+    describe 'when team limit has been reached', ->
+
+      it 'should fail to generate a stack from the template', (done) ->
+
+        options       =
+          machines    : generateStackMachineData 2
+          createGroup : yes
+
+        withConvertedUserAndStackTemplate options, ({ client, group, stackTemplate }) ->
+
+          async.series [
+
+            (next) ->
               group.update { $set: { 'config.testlimit': 'test' } }, (err) ->
                 expect(err).to.not.exist
                 next()

             (next) ->
-              ComputeProvider   = require './computeprovider'
               ComputeProvider.updateGroupStackUsage group, 'increment', (err) ->
                 expect(err).to.not.exist
                 next()


Fix spec organization

Fix spec organization

Signed-off-by: Max Brunsfeld <78036c9b69b887700d5846f26a788d53b201ffbb@gmail.com>

--- spec/text-editor-presenter-spec.coffee
+++ spec/text-editor-presenter-spec.coffee
@@ -535,46 +535,46 @@
           presenter = new TextEditorPresenter(model: editor, clientHeight: 20, scrollTop: 0, lineHeight: 10, lineOverdrawMargin: 0, baseCharacterWidth: 10)
           expect(stateForCursor(presenter, 0).width).toBe 10

-        describe ".blinkOff", ->
-          it "alternates between true and false twice per ::cursorBlinkPeriod", ->
-            cursorBlinkPeriod = 100
-            cursorBlinkResumeDelay = 200
-            presenter = new TextEditorPresenter({model: editor, cursorBlinkPeriod, cursorBlinkResumeDelay})
-
-            expect(presenter.state.content.blinkCursorsOff).toBe false
-            expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2)
-            expect(presenter.state.content.blinkCursorsOff).toBe true
-            expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2)
-            expect(presenter.state.content.blinkCursorsOff).toBe false
-            expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2)
-            expect(presenter.state.content.blinkCursorsOff).toBe true
-
-          it "stops alternating for ::cursorBlinkResumeDelay when a cursor moves or a cursor is added", ->
-            cursorBlinkPeriod = 100
-            cursorBlinkResumeDelay = 200
-            presenter = new TextEditorPresenter({model: editor, cursorBlinkPeriod, cursorBlinkResumeDelay})
-
-            expect(presenter.state.content.blinkCursorsOff).toBe false
-            expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2)
-            expect(presenter.state.content.blinkCursorsOff).toBe true
-
-            expectStateUpdate presenter, -> editor.moveRight()
-            expect(presenter.state.content.blinkCursorsOff).toBe false
-
-            expectStateUpdate presenter, ->
-              advanceClock(cursorBlinkResumeDelay)
-              advanceClock(cursorBlinkPeriod / 2)
-
-            expect(presenter.state.content.blinkCursorsOff).toBe true
-            expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2)
-            expect(presenter.state.content.blinkCursorsOff).toBe false
-            expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2)
-            expect(presenter.state.content.blinkCursorsOff).toBe true
-
-            expectStateUpdate presenter, -> editor.addCursorAtBufferPosition([1, 0])
-            expect(presenter.state.content.blinkCursorsOff).toBe false
-
-            expectStateUpdate presenter, ->
-              advanceClock(cursorBlinkResumeDelay)
-              advanceClock(cursorBlinkPeriod / 2)
-            expect(presenter.state.content.blinkCursorsOff).toBe true
+      describe ".blinkCursorsOff", ->
+        it "alternates between true and false twice per ::cursorBlinkPeriod", ->
+          cursorBlinkPeriod = 100
+          cursorBlinkResumeDelay = 200
+          presenter = new TextEditorPresenter({model: editor, cursorBlinkPeriod, cursorBlinkResumeDelay})
+
+          expect(presenter.state.content.blinkCursorsOff).toBe false
+          expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2)
+          expect(presenter.state.content.blinkCursorsOff).toBe true
+          expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2)
+          expect(presenter.state.content.blinkCursorsOff).toBe false
+          expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2)
+          expect(presenter.state.content.blinkCursorsOff).toBe true
+
+        it "stops alternating for ::cursorBlinkResumeDelay when a cursor moves or a cursor is added", ->
+          cursorBlinkPeriod = 100
+          cursorBlinkResumeDelay = 200
+          presenter = new TextEditorPresenter({model: editor, cursorBlinkPeriod, cursorBlinkResumeDelay})
+
+          expect(presenter.state.content.blinkCursorsOff).toBe false
+          expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2)
+          expect(presenter.state.content.blinkCursorsOff).toBe true
+
+          expectStateUpdate presenter, -> editor.moveRight()
+          expect(presenter.state.content.blinkCursorsOff).toBe false
+
+          expectStateUpdate presenter, ->
+            advanceClock(cursorBlinkResumeDelay)
+            advanceClock(cursorBlinkPeriod / 2)
+
+          expect(presenter.state.content.blinkCursorsOff).toBe true
+          expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2)
+          expect(presenter.state.content.blinkCursorsOff).toBe false
+          expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2)
+          expect(presenter.state.content.blinkCursorsOff).toBe true
+
+          expectStateUpdate presenter, -> editor.addCursorAtBufferPosition([1, 0])
+          expect(presenter.state.content.blinkCursorsOff).toBe false
+
+          expectStateUpdate presenter, ->
+            advanceClock(cursorBlinkResumeDelay)
+            advanceClock(cursorBlinkPeriod / 2)
+          expect(presenter.state.content.blinkCursorsOff).toBe true


Enable XMPP SSL

Enable XMPP SSL

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