JSSegmentedControl update

JSSegmentedControl update

error: pathspec 'JSKit/04_JSSegmentedControl.coffee' did not match any file(s) known to git

--- JSKit/04_JSSegmentedControl.coffee
+++ JSKit/04_JSSegmentedControl.coffee
@@ -0,0 +1,37 @@
+#*****************************************
+# JSSegmentedControl - radio switch parts class
+# Coded by kouichi.sakazaki 2013.11.05
+#*****************************************
+
+class JSSegmentedControl extends JSControl
+	constructor:(@_dataarray)->
+		super(JSRectMake(0, 0, 120, 32))
+		@_bgColor = JSColor("clearColor")
+		@_selectedSegmentIndex = -1
+		@_textSize = 12
+
+	setValue:(@_selectedSegmentIndex)->
+		if ($(@_viewSelector+"_radio").length)
+			$("input:radio[name='"+@_objectID+"_radio'][value='"+@_selectedSegmentIndex+"']").attr("checked", "checked")
+			$(@_viewSelector+"_radio").buttonset('refresh')
+
+	setTextSize:(@_textSize)->
+
+	viewDidAppear:->
+		super()
+		if (!@_dataarray?)
+			return
+
+		tag = '
'
+		for i in [0...@_dataarray.length]
+			tag += '<input type="radio" id="'+@_objectID+'_radio_'+i+'" name="'+@_objectID+'_radio" value="'+i+'" />
'+@_dataarray[i]+'
'
+		tag += '
'
+
+		if ($(@_viewSelector+"_radio").length)
+			$(@_viewSelector+"_radio").remove()
+		$(@_viewSelector).append(tag)
+		$(@_viewSelector+"_radio").buttonset()
+		$(@_viewSelector).unbind().bind 'tap', =>
+			@_selectedSegmentIndex = $("input[name='"+@_objectID+"_radio']:checked").val()
+			@action(@_self)
+		@setValue(@_selectedSegmentIndex)


No parens around fn

No parens around fn

--- src/package-manager.coffee
+++ src/package-manager.coffee
@@ -444,7 +444,7 @@
       if isSymLink
         fs.unlink(directory)
       else if isDir
-        fs.remove(directory, ->)
+        fs.remove directory, ->

 if Grim.includeDeprecatedAPIs
   EmitterMixin = require('emissary').Emitter


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


Add spec coverage for indent guides + invisibles on blank lines

--- spec/text-editor-component-spec.coffee
+++ spec/text-editor-component-spec.coffee
@@ -373,6 +373,22 @@
         expect(line2LeafNodes[1].classList.contains('indent-guide')).toBe true
         expect(line2LeafNodes[2].textContent).toBe '  '
         expect(line2LeafNodes[2].classList.contains('indent-guide')).toBe true
+
+      it "renders indent guides correctly on lines containing only whitespace when invisibles are enabled", ->
+        atom.config.set 'editor.showInvisibles', true
+        atom.config.set 'editor.invisibles', space: '-', eol: 'x'
+        editor.getBuffer().insert([1, Infinity], '\n      ')
+        nextAnimationFrame()
+
+        line2LeafNodes = getLeafNodes(component.lineNodeForScreenRow(2))
+        expect(line2LeafNodes.length).toBe 4
+        expect(line2LeafNodes[0].textContent).toBe '--'
+        expect(line2LeafNodes[0].classList.contains('indent-guide')).toBe true
+        expect(line2LeafNodes[1].textContent).toBe '--'
+        expect(line2LeafNodes[1].classList.contains('indent-guide')).toBe true
+        expect(line2LeafNodes[2].textContent).toBe '--'
+        expect(line2LeafNodes[2].classList.contains('indent-guide')).toBe true
+        expect(line2LeafNodes[3].textContent).toBe 'x'

       it "does not render indent guides in trailing whitespace for lines containing non whitespace characters", ->
         editor.getBuffer().setText "  hi  "


:fire:

:fire:

--- spec/text-editor-presenter-spec.coffee
+++ spec/text-editor-presenter-spec.coffee
@@ -5,7 +5,7 @@
 TextEditor = require '../src/text-editor'
 TextEditorPresenter = require '../src/text-editor-presenter'

-fdescribe "TextEditorPresenter", ->
+describe "TextEditorPresenter", ->
   # These `describe` and `it` blocks mirror the structure of the ::state object.
   # Please maintain this structure when adding specs for new state fields.
   describe "::getState()", ->


Add Optional Accept Button to Linter Message

Some linters (for instance haskell's hlint) suggest better code that
may replace offending expressions. It makes sense to have a button to
click on that removes the offending range and inserts the fix the
linter proposed.

http://imgur.com/ocTqVtk (see bottom right!)

This commit adds such a feature: if a message has an optional field
called `replacement` (of type string), the message window will offer
an "Accept!" option next to the source location. Clicking this option
replaces the marked range with the replacement string.

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


Search for a more specific string

Search for a more specific string

This spec only requires one match so don't search
for something that has many matches and will take
longer to display.

Reduces the run time of this spec by ~1.5 seconds.

--- src/packages/command-panel/spec/command-panel-spec.coffee
+++ src/packages/command-panel/spec/command-panel-spec.coffee
@@ -127,7 +127,7 @@
     describe "when the preview list is/was previously visible", ->
       beforeEach ->
         rootView.trigger 'command-panel:toggle'
-        waitsForPromise -> commandPanel.execute('X x/a+/')
+        waitsForPromise -> commandPanel.execute('X x/quicksort/')

       describe "when the command panel is visible", ->
         beforeEach ->


Fix Uncaught TypeError

Fix Uncaught TypeError

https://github.com/diiq/atomatigit/issues/91

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


Adds initial common commands.

Adds initial common commands.

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

--- scripts/common.coffee
+++ scripts/common.coffee
@@ -0,0 +1,13 @@
+# A collection of common, simple text response
+# commands that don’t require data from elsewhere
+#
+# Command(s):
+#   hubot schedule    — Return the current stream schedule
+#   hubot social      — Links to Twitter and Facebook
+
+module.exports = (robot) ->
+    robot.respond /schedule/i, (msg) ->
+        msg.send "Our current schedule is Tuesday, Thursday, Saturday 10pm-1am GMT and Sunday 10pm-12am GMT."
+
+    robot.respond /social/i, (msg) ->
+        msg.send "You can find me on Twitter at http://twitter.com/masonest_ and on Facebook at http://facebook.com/masonest"


home: create a new wrapper modal for only welcome page

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


Add initial Settings View menu

Add initial Settings View menu

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

--- menus/settings-view.cson
+++ menus/settings-view.cson
@@ -0,0 +1,13 @@
+'menu': [
+  {
+    'label': 'Packages'
+    'submenu': [
+      'label': 'Settings View'
+      'submenu': [
+        { 'label': 'Change Themes', 'command': 'settings-view:change-themes' }
+        { 'label': 'Install Themes', 'command': 'settings-view:install-themes' }
+        { 'label': 'Install Packages', 'command': 'settings-view:install-packages' }
+      ]
+    ]
+  }
+]


RETS Parsing - Set the default delimiter to \t instead of null

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/sbruno81/rets-client.git/'


Forgot it was coffeescript

Forgot it was coffeescript

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


changing showDiplomatSuggestionModal function name and moving language build call to it from afterRender

--- app/views/kinds/RootView.coffee
+++ app/views/kinds/RootView.coffee
@@ -15,12 +15,8 @@
 module.exports = class RootView extends CocoView
   events:
     "click #logout-button": "logoutAccount"
-    'change .language-dropdown': 'showDiplomatSuggestionModal'
+    'change .language-dropdown': 'onLanguageChanged'
     'click .toggle-fullscreen': 'toggleFullscreen'
-
-  afterRender: ->
-    super()
-    @buildLanguages()

   logoutAccount: ->
     logoutUser($('#login-email').val())
@@ -60,11 +56,12 @@
         $("<option></option>").val(code).text(localeInfo.nativeDescription))
     $select.val(preferred).fancySelect()

-  showDiplomatSuggestionModal: ->
+  onLanguageChanged: ->
     newLang = $(".language-dropdown").val()
     $.i18n.setLng(newLang, {})
     @saveLanguage(newLang)
     @render()
+    @buildLanguages()
     unless newLang.split('-')[0] is "en"
       @openModalView(application.router.getView("modal/diplomat_suggestion", "_modal"))


Change angular.foreach loop for native loop

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/GregDesplaces/classe-1914.git/'


Fixed the patch view loading.

Fixed the patch view loading.

--- app/views/editor/patch_modal.coffee
+++ app/views/editor/patch_modal.coffee
@@ -37,9 +37,11 @@
     if @targetModel.hasWriteAccess()
       headModel = @originalSource.clone(false)
       headModel.set(@targetModel.attributes)
+      headModel.loaded = true

     pendingModel = @originalSource.clone(false)
     pendingModel.applyDelta(@patch.get('delta'))
+    pendingModel.loaded = true

     @deltaView = new DeltaView({model:pendingModel, headModel:headModel})
     changeEl = @$el.find('.changes-stub')


Mock season.writeFileSyne instead of fs.writeFileSync in config specs

The spec suite has been overwriting my config directory in weird cases.
While investigating it I noticed that we mock writeFileSync directly in
these specs, but we actually use season to write the config cson. This
makes this spec a bit simpler because it doesn't have to parse the CSON
in the spec. Lower level assertions belong on the season package itself.

--- spec/config-spec.coffee
+++ spec/config-spec.coffee
@@ -108,10 +108,10 @@
       expect(atom.config.getPositiveInt('editor.preferredLineLength', 80)).toBe 80

   describe ".save()", ->
-    nodeFs = require 'fs'
-
-    beforeEach ->
-      spyOn(nodeFs, 'writeFileSync')
+    CSON = require 'season'
+
+    beforeEach ->
+      spyOn(CSON, 'writeFileSync')
       jasmine.unspy atom.config, 'save'

     describe "when ~/.atom/config.json exists", ->
@@ -122,12 +122,12 @@
         atom.config.set("x.y.z", 3)
         atom.config.setDefaults("a.b", e: 4, f: 5)

-        nodeFs.writeFileSync.reset()
+        CSON.writeFileSync.reset()
         atom.config.save()

-        expect(nodeFs.writeFileSync.argsForCall[0][0]).toBe(path.join(atom.config.configDirPath, "atom.config.json"))
-        writtenConfig = JSON.parse(nodeFs.writeFileSync.argsForCall[0][1])
-        expect(writtenConfig).toEqual atom.config.settings
+        expect(CSON.writeFileSync.argsForCall[0][0]).toBe(path.join(atom.config.configDirPath, "atom.config.json"))
+        writtenConfig = CSON.writeFileSync.argsForCall[0][1]
+        expect(writtenConfig).toBe atom.config.settings

     describe "when ~/.atom/config.json doesn't exist", ->
       it "writes any non-default properties to ~/.atom/config.cson", ->
@@ -137,12 +137,12 @@
         atom.config.set("x.y.z", 3)
         atom.config.setDefaults("a.b", e: 4, f: 5)

-        nodeFs.writeFileSync.reset()
+        CSON.writeFileSync.reset()
         atom.config.save()

-        expect(nodeFs.writeFileSync.argsForCall[0][0]).toBe(path.join(atom.config.configDirPath, "atom.config.cson"))
+        expect(CSON.writeFileSync.argsForCall[0][0]).toBe(path.join(atom.config.configDirPath, "atom.config.cson"))
         CoffeeScript = require 'coffee-script'
-        writtenConfig = CoffeeScript.eval(nodeFs.writeFileSync.argsForCall[0][1], bare: true)
+        writtenConfig = CSON.writeFileSync.argsForCall[0][1]
         expect(writtenConfig).toEqual atom.config.settings

   describe ".setDefaults(keyPath, defaults)", ->


Update line-map

Update line-map

--- src/app/line-map.coffee
+++ src/app/line-map.coffee
@@ -28,7 +28,7 @@
     for screenLine in maxLengthCandidates
       @maxScreenLineLength = Math.max(@maxScreenLineLength, screenLine.text.length)

-  # Public: Gets the line for the given screen row.
+  # Gets the line for the given screen row.
   #
   # screenRow - A {Number} indicating the screen row.
   #
@@ -36,7 +36,7 @@
   lineForScreenRow: (row) ->
     @screenLines[row]

-  # Public: Gets the lines for the given screen row boundaries.
+  # Gets the lines for the given screen row boundaries.
   #
   # start - A {Number} indicating the beginning screen row.
   # end - A {Number} indicating the ending screen row.
@@ -45,7 +45,7 @@
   linesForScreenRows: (startRow, endRow) ->
     @screenLines[startRow..endRow]

-  # Public: Given starting and ending screen rows, this returns an array of the
+  # Given starting and ending screen rows, this returns an array of the
   # buffer rows corresponding to every screen row in the range
   #
   # startRow - The screen row {Number} to start at
@@ -100,7 +100,7 @@
       column = screenLine.clipScreenColumn(column, options)
     new Point(row, column)

-  # Public: Given a buffer position, this converts it into a screen position.
+  # Given a buffer position, this converts it into a screen position.
   #
   # bufferPosition - An object that represents a buffer position. It can be either
   #                  an {Object} (`{row, column}`), {Array} (`[row, column]`), or {Point}
@@ -140,7 +140,7 @@

     [screenRow, screenLines]

-  # Public: Given a buffer range, this converts it into a screen position.
+  # Given a buffer range, this converts it into a screen position.
   #
   # screenPosition - An object that represents a buffer position. It can be either
   #                  an {Object} (`{row, column}`), {Array} (`[row, column]`), or {Point}
@@ -163,7 +163,7 @@

     [bufferRow, screenLine]

-  # Public: Given a buffer range, this converts it into a screen position.
+  # Given a buffer range, this converts it into a screen position.
   #
   # bufferRange - The {Range} to convert
   #
@@ -174,7 +174,7 @@
     end = @screenPositionForBufferPosition(bufferRange.end)
     new Range(start, end)

-  # Public: Given a screen range, this converts it into a buffer position.
+  # Given a screen range, this converts it into a buffer position.
   #
   # screenRange - The {Range} to convert
   #


added application stories

added application stories

error: pathspec 'spec/javascripts/stories/application_stories.js.coffee' did not match any file(s) known to git

--- spec/javascripts/stories/application_stories.js.coffee
+++ spec/javascripts/stories/application_stories.js.coffee
@@ -0,0 +1,47 @@
+#= require brancusi/application
+
+feature "Application", ->
+
+  summary(
+      'As a client of the framework',
+      'I want to bootstrap and run my application'
+  )
+
+  scenario "Initialize the application models", ->
+
+    Application = bootstrapper = null
+
+    Given "I have an application", ->
+      Application = class extends brancusi.Application
+
+    When "I configure it with a model and run it", ->
+      Application.config.models.User = class extends brancusi.Model
+        @attr "screen_name"
+
+      app = new Application
+      app.run(new Bootstrapper)
+
+    Then "the module is configured and ...", ->
+      user = app.models.User.create(screen_name: 'user123')
+      expect( user instanceof Application.config.models.User ).toBe true
+
+  scenario "Initalize the application modules", ->
+
+    Application = bootstrapper = null
+
+    Given "I have an application", ->
+      Application = class extends brancusi.Application
+
+    When "I configure it with a module and run it", ->
+      Application.config.modules.ExampleModule = class extends brancusi.ApplicationModule
+        @on "event", -> @event_handler()
+        event_handler: ->
+
+    Then "the module is instantiated during initialization", ->
+      expect(app.modules.example instanceof Application.config.modules.ExampleModule)
+
+    And "the module event handlers are bound", ->
+      spyOn(app.modules.example, 'event_handler')
+      app.publish('event')
+      expect(app.modules.example.event_handler).toHaveBeenCalled()
+


:lipstick: Give dummy pane items ::getUri and ::getPath methods

--- spec/pane-spec.coffee
+++ spec/pane-spec.coffee
@@ -6,6 +6,8 @@
 describe "Pane", ->
   class Item extends Model
     constructor: (@name) ->
+    getUri: -> @uri
+    getPath: -> @path

   describe "construction", ->
     it "sets the active item to the first item", ->
@@ -166,16 +168,15 @@
       expect(pane.items).toEqual [item2]

   describe "::saveActiveItem()", ->
-    [pane, activeItemUri] = []
+    pane = null

     beforeEach ->
       pane = new Pane(items: [new Item("A")])
       spyOn(atom, 'showSaveDialogSync').andReturn('/selected/path')
-      pane.activeItem.getUri = -> activeItemUri

     describe "when the active item has a uri", ->
       beforeEach ->
-        activeItemUri = "test"
+        pane.activeItem.uri = "test"

       describe "when the active item has a save method", ->
         it "saves the current item", ->
@@ -189,9 +190,6 @@
           pane.saveActiveItem()

     describe "when the current item has no uri", ->
-      beforeEach ->
-        activeItemUri = null
-
       describe "when the current item has a saveAs method", ->
         it "opens a save dialog and saves the current item as the selected path", ->
           pane.activeItem.saveAs = jasmine.createSpy("saveAs")
@@ -206,18 +204,18 @@
           expect(atom.showSaveDialogSync).not.toHaveBeenCalled()

   describe "::saveActiveItemAs()", ->
-    [pane, activeItemUri] = []
+    pane = null

     beforeEach ->
       pane = new Pane(items: [new Item("A")])
       spyOn(atom, 'showSaveDialogSync').andReturn('/selected/path')
-      pane.activeItem.getUri = -> "test"

     describe "when the current item has a saveAs method", ->
       it "opens the save dialog and calls saveAs on the item with the selected path", ->
+        pane.activeItem.path = __filename
         pane.activeItem.saveAs = jasmine.createSpy("saveAs")
         pane.saveActiveItemAs()
-        expect(atom.showSaveDialogSync).toHaveBeenCalledWith(activeItemUri)
+        expect(atom.showSaveDialogSync).toHaveBeenCalledWith(__dirname)
         expect(pane.activeItem.saveAs).toHaveBeenCalledWith('/selected/path')

     describe "when the current item does not have a saveAs method", ->


remove chromedriver task for now

remove chromedriver task for now

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


Check if selector matches parents of test element

Previously a menu for a keybinding with a .workspace selector would not
display the shortcut because the selector wasn't matching the test editor
element directly.

Now the parent elements of the test editor are checked as well.

Closes #2089

--- src/menu-manager.coffee
+++ src/menu-manager.coffee
@@ -69,7 +69,12 @@
       @testEditor.classList.add('editor')
       testWorkspace.appendChild(@testEditor)

-    @testEditor.webkitMatchesSelector(selector)
+    element = @testEditor
+    while element
+      return true if element.webkitMatchesSelector(selector)
+      element = element.parentElement
+
+    false

   # Public: Refreshes the currently visible menu.
   update: ->


return default class when label not found

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/MicrosmartSA/ubiquity-ui.git/'


Built-in modules' code are now in asar archive

--- src/module-cache.coffee
+++ src/module-cache.coffee
@@ -200,7 +200,7 @@
     cache.builtins.atom = atomCoffeePath if fs.isFileSync(atomCoffeePath)
   cache.builtins.atom ?= path.join(cache.resourcePath, 'exports', 'atom.js')

-  atomShellRoot = path.join(process.resourcesPath, 'atom')
+  atomShellRoot = path.join(process.resourcesPath, 'atom.asar')

   commonRoot = path.join(atomShellRoot, 'common', 'api', 'lib')
   commonBuiltins = ['callbacks-registry', 'clipboard', 'crash-reporter', 'screen', 'shell']


motion level fix

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


refactor _.find

refactor _.find

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


Simplify code formatting in JUser::unblock method

--- workers/social/lib/social/models/user/index.coffee
+++ workers/social/lib/social/models/user/index.coffee
@@ -1944,14 +1944,16 @@

   unblock: (callback) ->

-    @update
-      $set            :
-        blockedUntil  : new Date()
-    , (err) =>
-      return callback err if err
+    op =
+      $set   : { status: 'confirmed' }
+      $unset : { blockedUntil: yes }
+
+    @update op, (err) =>
+
+      return callback err  if err

       JUser.emit 'UserUnblocked', this
-      return callback err
+      callback()

   unlinkOAuths: (callback) ->


moved convert method input validation to another function


Kill all atom.exe before signing

Kill all atom.exe before signing

--- build/tasks/codesign-task.coffee
+++ build/tasks/codesign-task.coffee
@@ -28,7 +28,8 @@
         args = ['-f', '-v', '-s', 'Developer ID Application: GitHub', grunt.config.get('atom.shellAppDir')]
         spawn {cmd, args}, (error) -> callback(error)
       when 'win32'
-        cmd = process.env.JANKY_SIGNTOOL ? 'signtool'
+        signtool = process.env.JANKY_SIGNTOOL ? 'signtool'
+        cmd = 'taskkill /FIM atom.exe & ' + signtool
         args = [path.join(grunt.config.get('atom.shellAppDir'), 'atom.exe')]
         spawn {cmd, args}, (error) -> callback(error)
       else


fixed typo

fixed typo

--- test/readerrdy_test.coffee
+++ test/readerrdy_test.coffee
@@ -692,7 +692,7 @@

       expect(readerRdy.current_state_name).to.eql 'TRY_ONE'

-    it 'should update the value of @isPaused when pased', ->
+    it 'should update the value of @isPaused when paused', ->
       readerRdy.pause()
       expect(readerRdy.isPaused()).to.be.true


Attempt fix of airing date.

Attempt fix of airing date.

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


Don't start TimeReporter once again when restarting movie

--- app/assets/javascripts/player/movie.js.coffee
+++ app/assets/javascripts/player/movie.js.coffee
@@ -86,7 +86,6 @@
   restart: ->
     @reset()
     @start()
-    @startTimeReporter()

   pause: ->
     return if @isPaused()


Added allow/deny rules.

Added allow/deny rules.

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


:lipstick:

:lipstick:

--- src/app/editor.coffee
+++ src/app/editor.coffee
@@ -74,7 +74,7 @@
       @setBuffer(new Buffer)

   serialize: ->
-    @saveCurrentEditSession()
+    @saveActiveEditSession()
     { viewClass: "Editor", editSessions: @serializeEditSessions(), @activeEditSessionIndex, @isFocused }

   serializeEditSessions: ->
@@ -355,7 +355,7 @@
   setActiveEditSessionIndex: (index) ->
     throw new Error("Edit session not found") unless @editSessions[index]

-    @saveCurrentEditSession() if @activeEditSession
+    @saveActiveEditSession() if @activeEditSession

     @activeEditSession = @editSessions[index]
     @activeEditSessionIndex = index
@@ -371,7 +371,7 @@
     @scrollTop(@activeEditSession.scrollTop ? 0)
     @scrollView.scrollLeft(@activeEditSession.scrollLeft ? 0)

-  saveCurrentEditSession: ->
+  saveActiveEditSession: ->
     @activeEditSession.setCursorScreenPosition(@getCursorScreenPosition())
     @activeEditSession.setScrollTop(@scrollTop())
     @activeEditSession.setScrollLeft(@scrollView.scrollLeft())


_ and - both considered non word characters. Fixes #82

Maybe @defunkt wanted the reverse though (consider _ and - word characters)? Either way, it's a config option you can change now.

--- src/app/editor.coffee
+++ src/app/editor.coffee
@@ -19,7 +19,7 @@
     autosave: false
     autoIndent: true
     autoIndentOnPaste: false
-    nonWordCharacters: "./\()\"’-:,.;<>~!@#$%^&*|+=[]{}`~?"
+    nonWordCharacters: "./\()\"’-_:,.;<>~!@#$%^&*|+=[]{}`~?"

   @content: (params) ->
     @div class: @classes(params), tabindex: -1, =>


making the underlayer min-height instead of height, to see the wrap guide go full screen

--- src/app/editor.coffee
+++ src/app/editor.coffee
@@ -746,7 +746,7 @@
     height = @lineHeight * @screenLineCount()
     unless @layerHeight == height
       @renderedLines.height(height)
-      @underlayer.height(height)
+      @underlayer.css('min-height', height)
       @overlayer.height(height)
       @layerHeight = height


Add CIDFont support

Add CIDFont support

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


Add error message for deleting zero threshold

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


cursor camera navigation in all resolutions

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/tcarlsen/pixel-moba.git/'


Reduced preview lines from 15 to 10.

Reduced preview lines from 15 to 10.

--- app/assets/javascripts/app/controllers/agent_ticket_zoom.js.coffee
+++ app/assets/javascripts/app/controllers/agent_ticket_zoom.js.coffee
@@ -408,11 +408,11 @@
     # build html body
     # cleanup body
     @article['html'] = @article.body.trim()
-    @article['html'].replace(/\n\r/g, "\n")
-    @article['html'].replace(/\n\n\n/g, "\n\n")
+    @article['html'].replace( /\n\r/g, "\n" )
+    @article['html'].replace( /\n\n\n/g, "\n\n" )

     # if body has more then x lines / else search for signature
-    preview       = 15
+    preview       = 10
     preview_mode  = false
     article_lines = @article['html'].split(/\n/)
     if article_lines.length > preview
@@ -433,7 +433,7 @@
         notify + '
'
       if @article_changed
         @article['html'] = @article['html'] + '
'
-
+
     # hide signatures and so on
     else
       @article_changed = false


Added coffee file to convert cfour.js to

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

--- public/javascripts/c4.coffee
+++ public/javascripts/c4.coffee
@@ -0,0 +1,11 @@
+GameBoard = (canvas, overlayCanvas, options) ->
+  this.defaults = { gridWidth: 7, gridHeight: 7, cellSize: 80 }
+
+$( ->
+  gameBoard = new GameBoard($('#canvas'), $('#canvasOverlay'), {
+    afterMove: (grid) ->
+      console.log('After move: ')
+      console.log(grid)
+    }
+  )
+)


Add clamp util function.

Add clamp util function.

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

--- src/util/clamp.coffee
+++ src/util/clamp.coffee
@@ -0,0 +1,15 @@
+###*
+# Clamps the passed value `v` to within `min` and `max` values.
+#
+# @param {number} v - The value to clamp.
+#
+# @param {number} min - The minimum value.
+#
+# @param {number} max - The maximum value.
+#
+# @returns {number} A number between `min` and `max`.
+#
+# @exports stout-ui/util/clamp
+# @function clamp
+###
+module.exports = (v, min, max) -> Math.max(min, Math.min(max, v))


Update pt-PT.coffee

Update pt-PT.coffee

--- app/locale/pt-PT.coffee
+++ app/locale/pt-PT.coffee
@@ -305,7 +305,7 @@
 #    player_code: "Player Code"

   employers:
-    hire_developers_not_credentials: "Contrate desenvolvedores, não cartas de recomendação."
+    hire_developers_not_credentials: "Contrate programadores, não cartas de recomendação."
     get_started: "Começar"
     already_screened: "Nós já selecionamos tecnicamente todos os nossos candidatos"
     filter_further: ", mas ainda pode filtrar mais:"
@@ -333,7 +333,7 @@
 #    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: "Make my hiring easier, please."
     what: "O que é o CodeCombat?"
-    what_blurb: "O CodeCombat é um jogo de programação, no navegador e multijogador. Os jogadores escrevem código para controlar as forças deles em batalha contra outros desenvolvedores. Os nossos jogadores têm experiência com todos os conceitos tecnológicos principais."
+    what_blurb: "O CodeCombat é um jogo de programação, no navegador e multijogador. Os jogadores escrevem código para controlar as forças deles em batalha contra outros programadores. Os nossos jogadores têm experiência com todos os conceitos tecnológicos principais."
     cost: "Quanto é que cobramos?"
     cost_blurb: "Cobramos 15% do salário do primeiro ano e ofereçemos uma garantia de devolução de 100% do dinheiro durante 90 dias. Não cobramos por candidatos que já estejam a ser ativamente entrevistados na sua companhia."
     candidate_name: "Nome"
@@ -344,9 +344,9 @@
     candidate_years_experience: "Anos de Experiência"
     candidate_last_updated: "Última Vez Atualizado"
     candidate_who: "Quem"
-    featured_developers: "Desenvolvedores em Destaque"
-    other_developers: "Outros Desenvolvedores"
-    inactive_developers: "Desenvolvedores Inativos"
+    featured_developers: "Programadores em Destaque"
+    other_developers: "Outros Programadores"
+    inactive_developers: "Programadores Inativos"

   play_level:
     done: "Concluir"
@@ -630,7 +630,7 @@
     email_title: "E-mail"
     email_description_prefix: "Nós não o inundaremos com spam. Através das"
     email_settings_url: "suas definições de e-mail"
-    email_description_suffix: "ou através de ligações presentes nos e-mails que enviamos, pode mudar as suas preferências e parar a sua subscrição facilmente em qualquer momento."
+    email_description_suffix: "ou através de ligações presentes nos e-mails que enviamos, pode mudar as suas preferências e parar a sua subscrição facilmente, em qualquer momento."
     cost_title: "Custo"
 #    cost_description: "Currently, CodeCombat is 100% free! One of our main goals is to keep it that way, so that as many people can play as possible, regardless of place in life. If the sky darkens, we might have to charge subscriptions or for some content, but we'd rather not. With any luck, we'll be able to sustain the company with:"
     recruitment_title: "Recrutamento"
@@ -849,17 +849,17 @@

   multiplayer_launch:
     introducing_dungeon_arena: "Introduzindo a Dungeon Arena"
-    new_way: "Uma nova forma de competir com código."
-    to_battle: "Às armas, Programadores!"
-    modern_day_sorcerer: "Sabes programar? És tão forte! És um feiticeiro dos tempos modernos! Será que não está na altura de usares os teus poderes mágicos de programação para comandar os teus servos em combates épicos? E não estamos a falar de robots."
-    arenas_are_here: "As arenas mano-a-mano multiplayer de CodeCombat estão aqui."
-    ladder_explanation: "Escolhe os teus heróis, encanta os teus exércitos de ogres ou humanos, e constrói o teu caminho, derrotando outros Feiticeiros para chegares ao topo da classificação. Depois, desafia os teus amigos para gloriosas arenas de programação multijogador. Se te sentes criativo, podes até"
-    fork_our_arenas: "alterar as nossas arenas"
-    create_worlds: "e criar os teus próprios mundos."
-    javascript_rusty: "O teu JavaScript está enferrujado? Não te preocupes; Existe um"
+    new_way: "A nova forma de competir com código."
+    to_battle: "Para o Combate, Programadores!"
+    modern_day_sorcerer: "Sabe programar? Isso é demais! É um feiticeiro dos tempos modernos! Não estará na altura de usar os seus poderes mágicos de programação para comandar os seus minions em combates épicos? E não estamos a falar de robôs."
+    arenas_are_here: "As arenas multijogador do CodeCombat estão aqui."
+    ladder_explanation: "Escolha os seus heróis, enfeitice os seus exércitos de ogres ou de humanos e passe por cima de Feiticeiros derrotados para chegar ao topo da tabela classificativa - depois, compita contra os seus amigos nas nossas arenas de programação multijogador gloriosas. Se se sentir criativo, pode ainda"
+    fork_our_arenas: "bifurcar as nossas arenas"
+    create_worlds: "e criar os seus próprios mundos."
+    javascript_rusty: "O seu JavaScript está um pouco enferrujado? Não se preocupe; existe um"
     tutorial: "tutorial"
-    new_to_programming: ". Novo na programação? Faz a Campanha para Iniciantes para expandires as tuas capacidades."
-    so_ready: "Estou mais que pronto para isto"
+    new_to_programming: ". Novo na programação? Faça a nossa Campanha para Iniciantes para melhorar as suas capacidades."
+    so_ready: "Estou Mais Que Pronto Para Isto"

 #  loading_error:
 #    could_not_load: "Error loading from server"


Prewire config

Prewire config

error: pathspec 'src/recipes/config.cookbook.template.cson' did not match any file(s) known to git

--- src/recipes/config.cookbook.template.cson
+++ src/recipes/config.cookbook.template.cson
@@ -0,0 +1 @@
+recipes_path: ""


Improve JS error tracking

Improve JS error tracking

--- assets/javascripts/app/app.coffee
+++ assets/javascripts/app/app.coffee
@@ -1,6 +1,7 @@
 @app =
-  $: $
-  $$: $$
+  _$: $
+  _$$: $$
+  _page: page
   collections: {}
   models:      {}
   templates:   {}
@@ -53,7 +54,7 @@
         Raven.config @config.sentry_dsn,
           whitelistUrls: [/devdocs/]
           includePaths: [/devdocs/]
-          ignoreErrors: [/dpQuery/, /NPObject/]
+          ignoreErrors: [/dpQuery/, /NPObject/, /NS_ERROR/, /^null$/]
           tags:
             mode: if @DOC then 'single' else 'full'
             iframe: (window.top isnt window).toString()
@@ -163,6 +164,8 @@
     return

   onQuotaExceeded: ->
+    return if @quotaExceeded
+    @quotaExceeded = true
     new app.views.Notif 'QuotaExceeded', autoHide: null
     Raven.captureMessage 'QuotaExceededError'

@@ -188,7 +191,7 @@
   isInjectionError: ->
     # Some browser extensions expect the entire web to use jQuery.
     # I gave up trying to fight back.
-    window.$ isnt app.$ or window.$$ isnt app.$$
+    window.$ isnt app._$ or window.$$ isnt app._$$ or window.page isnt app._page

   isAppError: (error, file) ->
     # Ignore errors from external scripts.


Assigning an external output is now working

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


bettered docs for device.network API

bettered docs for device.network API

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


adds a link

adds a link


fixing the typo that prevented the gear updating

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


Allow to `add` multiple disposables

Allow to `add` multiple disposables

Pass `CompositeDisposable::add` multiple disposables, or an array of disposables and they all get added.

If/when you're on board with this, I can write a spec for it, but I wanted your  opinion first.

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


Fix header indentation

Fix header indentation

--- src/scripts/nickgen.coffee
+++ src/scripts/nickgen.coffee
@@ -1,26 +1,26 @@
 # Description:
-#	 Nickname generator
+#   Nickname generator
 #
 # Dependencies:
-#	 "cheerio": "0.10.5"
+#   "cheerio": "0.10.5"
 #
 # Configuration:
 #   None
 #
 # Commands:
-#	 hubot nick pirate <name> - Get your pirate name.
-#	 hubot nick wutang <name> - Get your Wutang Clan name.
-#	 hubot nick blues <name> - Get your Blues guitarist name.
-#	 hubot nick potter <name> - Get your Harry Potter universe name.
-#	 hubot nick hacker <name> - Get your l337 hacker name.
+#   hubot nick pirate <name> - Get your pirate name.
+#   hubot nick wutang <name> - Get your Wutang Clan name.
+#   hubot nick blues <name> - Get your Blues guitarist name.
+#   hubot nick potter <name> - Get your Harry Potter universe name.
+#   hubot nick hacker <name> - Get your l337 hacker name.
 #
-#	 hubot nick help - explains usage
+#   hubot nick help - explains usage
 #
 # Notes:
-#	 None
+#   None
 #
 # Author:
-#	 @commadelimited
+#   @commadelimited

 $ = require 'cheerio'

@@ -74,4 +74,4 @@
 	robot.respond /nick help/i, (msg) ->
 		count = Object.keys(options).length
 		list = ("#{name}" for name of options)
-		msg.send "Usage: nick <#{list}> <your name>"+		msg.send "Usage: nick <#{list}> <your name>"


make new entries collection that pulls all approved entries

error: pathspec 'client/collections/entries.coffee' did not match any file(s) known to git

--- client/collections/entries.coffee
+++ client/collections/entries.coffee
@@ -0,0 +1,10 @@
+_ = require 'underscore'
+Backbone = require 'backbone'
+Entry = require '../models/entry.coffee'
+sd = require('sharify').data
+
+module.exports = class Entries extends Backbone.Collection
+
+  url: "#{sd.API_URL}/entries"
+
+  model: Entry


:art: Remove log line

:art: Remove log line

--- spec/default-directory-searcher-spec.coffee
+++ spec/default-directory-searcher-spec.coffee
@@ -11,7 +11,6 @@
     searcher = new DefaultDirectorySearcher

   it "terminates the task after running a search", ->
-    console.log searcher
     options =
       ignoreCase: false
       includeHidden: false


Update atom-application documentation to latest format

--- src/atom-application.coffee
+++ src/atom-application.coffee
@@ -15,7 +15,7 @@

 socketPath = '/tmp/atom.sock'

-# Public: The application's singleton class.
+# Private: The application's singleton class.
 #
 # It's the entry point into the Atom application and maintains the global state
 # of the application.
@@ -166,10 +166,10 @@
   #
   # If it isn't handled globally, delegate to the currently focused window.
   #
-  # __Arguments__
-  #
-  # * command - The string representing the command.
-  # * args - The optional arguments to pass along.
+  # * command:
+  #   The string representing the command.
+  # * args:
+  #   The optional arguments to pass along.
   sendCommand: (command, args...) ->
     unless @emit(command, args...)
       @focusedWindow()?.sendCommand(command, args...)
@@ -185,23 +185,29 @@

   # Public: Opens multiple paths, in existing windows if possible.
   #
-  # __Options__
-  #
-  # + pathsToOpen - The array of file paths to open
-  # + pidToKillWhenClosed - The integer of the pid to kill
-  # + newWindow - Boolean of whether this should be opened in a new window.
-  # + devMode - Boolean to control the opened window's dev mode.
+  # * options
+  #    + pathsToOpen:
+  #      The array of file paths to open
+  #    + pidToKillWhenClosed:
+  #      The integer of the pid to kill
+  #    + newWindow:
+  #      Boolean of whether this should be opened in a new window.
+  #    + devMode:
+  #      Boolean to control the opened window's dev mode.
   openPaths: ({pathsToOpen, pidToKillWhenClosed, newWindow, devMode}) ->
     @openPath({pathToOpen, pidToKillWhenClosed, newWindow, devMode}) for pathToOpen in pathsToOpen ? []

   # Public: Opens a single path, in an existing window if possible.
   #
-  # __Options__
-  #
-  # + pathsToOpen - The array of file paths to open
-  # + pidToKillWhenClosed - The integer of the pid to kill
-  # + newWindow - Boolean of whether this should be opened in a new window.
-  # + devMode - Boolean to control the opened window's dev mode.
+  # * options
+  #    + pathsToOpen:
+  #      The array of file paths to open
+  #    + pidToKillWhenClosed:
+  #      The integer of the pid to kill
+  #    + newWindow:
+  #      Boolean of whether this should be opened in a new window.
+  #    + devMode:
+  #      Boolean to control the opened window's dev mode.
   openPath: ({pathToOpen, pidToKillWhenClosed, newWindow, devMode}={}) ->
     unless devMode
       existingWindow = @windowForPath(pathToOpen) unless pidToKillWhenClosed or newWindow
@@ -232,10 +238,11 @@
   #
   # Currently only supports atom://session/<session-id> urls.
   #
-  # __Options__
-  #
-  # + urlToOpen - The atom:// url to open.
-  # + devMode - Boolean to control the opened window's dev mode.
+  # * options
+  #    + urlToOpen:
+  #      The atom:// url to open.
+  #    + devMode:
+  #      Boolean to control the opened window's dev mode.
   openUrl: ({urlToOpen, devMode}) ->
     parsedUrl = url.parse(urlToOpen)
     if parsedUrl.host is 'session'
@@ -249,11 +256,13 @@

   # Private: Opens up a new {AtomWindow} to run specs within.
   #
-  # __Options__
-  #
-  # + exitWhenDone - A Boolean that if true, will close the window upon completion.
-  # + resourcePath - The path to include specs from.
-  # + specPath - The directory to load specs from.
+  # * options
+  #    + exitWhenDone:
+  #      A Boolean that if true, will close the window upon completion.
+  #    + resourcePath:
+  #      The path to include specs from.
+  #    + specPath:
+  #      The directory to load specs from.
   runSpecs: ({exitWhenDone, resourcePath}) ->
     if resourcePath isnt @resourcePath and not fs.existsSync(resourcePath)
       resourcePath = @resourcePath
@@ -267,10 +276,10 @@
   #
   # Once paths are selected, they're opened in a new or existing {AtomWindow}s.
   #
-  # __Options__
-  #
-  # + devMode - A Boolean which controls whether any newly opened windows should
-  #   be in dev mode or not.
+  # * options
+  #    + devMode:
+  #      A Boolean which controls whether any newly opened windows should  be in
+  #      dev mode or not.
   promptForPath: ({devMode}={}) ->
     pathsToOpen = dialog.showOpenDialog title: 'Open', properties: ['openFile', 'openDirectory', 'multiSelections', 'createDirectory']
     @openPaths({pathsToOpen, devMode})


Failing test.

Failing test.

--- test/javascripts/integration/manuscript_manager_template_test.js.coffee
+++ test/javascripts/integration/manuscript_manager_template_test.js.coffee
@@ -76,6 +76,7 @@
   click '.adhoc-content-toolbar .glyphicon-plus'
   click '.adhoc-content-toolbar .adhoc-toolbar-item--text'
   andThen ->
+    ok find('h1.inline-edit').hasClass('editing'), "The title should be editable to start"
     Em.$('.inline-edit-form div[contenteditable]')
     .html("New contenteditable, yahoo!")
     .trigger('keyup')


Sobo'd the spec.

Sobo'd the spec.

--- spec/atom/window-spec.coffee
+++ spec/atom/window-spec.coffee
@@ -1,14 +1,15 @@
 require 'window'

 describe "Window", ->
-  describe "bindKeys", ->
+  describe "keybindings", ->
     beforeEach ->
       window.startup()

     afterEach ->
       window.shutdown()

-    it 'creates "save" keybinding on "meta+s"', ->
-      spyOn(window.editor, 'save')
-      window.keydown 'meta+s'
-      expect(window.editor.save).toHaveBeenCalled()
+    describe 'meta+s', ->
+      it 'saves the buffer', ->
+        spyOn(window.editor, 'save')
+        window.keydown 'meta+s'
+        expect(window.editor.save).toHaveBeenCalled()


Fix gutter view rendering specs

Fix gutter view rendering specs

--- spec/editor-view-spec.coffee
+++ spec/editor-view-spec.coffee
@@ -1808,19 +1808,19 @@

     it "creates a line number element for each visible line with   padding to the left of the number", ->
       expect(editorView.gutter.find('.line-number').length).toBe 8
-      expect(editorView.find('.line-number:first').html()).toBe " 1"
-      expect(editorView.gutter.find('.line-number:last').html()).toBe " 8"
+      expect(editorView.find('.line-number:first').html()).toMatch /^ 1/
+      expect(editorView.gutter.find('.line-number:last').html()).toMatch /^ 8/

       # here we don't scroll far enough to trigger additional rendering
       editorView.scrollTop(editorView.lineHeight * 1.5)
       expect(editorView.renderedLines.find('.line').length).toBe 8
-      expect(editorView.gutter.find('.line-number:first').html()).toBe " 1"
-      expect(editorView.gutter.find('.line-number:last').html()).toBe " 8"
+      expect(editorView.gutter.find('.line-number:first').html()).toMatch /^ 1/
+      expect(editorView.gutter.find('.line-number:last').html()).toMatch /^ 8/

       editorView.scrollTop(editorView.lineHeight * 3.5)
       expect(editorView.renderedLines.find('.line').length).toBe 10
-      expect(editorView.gutter.find('.line-number:first').html()).toBe " 2"
-      expect(editorView.gutter.find('.line-number:last').html()).toBe "11"
+      expect(editorView.gutter.find('.line-number:first').html()).toMatch /^ 2/
+      expect(editorView.gutter.find('.line-number:last').html()).toMatch /^11/

     it "adds a .foldable class to lines that start foldable regions", ->
       expect(editorView.gutter.find('.line-number:eq(0)')).toHaveClass 'foldable'
@@ -1854,7 +1854,7 @@
         editorView.setWidthInChars(50)
         expect(editorView.gutter.find('.line-number').length).toEqual(8)
         expect(editorView.gutter.find('.line-number:eq(3)').intValue()).toBe 4
-        expect(editorView.gutter.find('.line-number:eq(4)').html()).toBe ' •'
+        expect(editorView.gutter.find('.line-number:eq(4)').html()).toMatch /^ •/
         expect(editorView.gutter.find('.line-number:eq(5)').intValue()).toBe 5

     describe "when there are folds", ->


convert test to coffee script

convert test to coffee script

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

--- tests/admin.go.coffee
+++ tests/admin.go.coffee
@@ -0,0 +1,325 @@
+baseURL = "http://localhost:8080"
+casper.start()
+casper.open baseURL + "/admin/"
+casper.then ->
+  @echo @getTitle()
+  currentUrl = @getCurrentUrl()
+  if currentUrl.match(/login/)
+    @click "#admin"
+    @thenClick "#submit-login"
+
+# test of /admin/
+casper.then ->
+  @echo @getTitle()
+  @test.assertHttpStatus 200
+
+# test of /admin/rest/models
+casper.thenOpen baseURL + "/admin/rest/models", ->
+  @test.assertHttpStatus 200
+  jsonData = JSON.parse(@getPageContent())
+  @test.assertEqual jsonData.models.length, 2, "total count of models should be 2"
+
+# test of /admin/rest/schema/adminpage
+casper.thenOpen baseURL + "/admin/rest/schema/adminpage", ->
+  @test.assertHttpStatus 200
+  jsonData = JSON.parse(@getPageContent())
+
+#this.test.assertEqual(jsonData.fields.length,9,'total count of models should be 9');
+#this.test.assertEqual(jsonData.model_name,'adminpage','title should be adminpage');
+
+# add entity by post
+casper.thenOpen baseURL + "/admin/rest/adminpage",
+  method: "post"
+  data:
+    title: "title1"
+    url: "url1"
+    pageorder: 1
+    content: "foobar"
+    displaypage: "on"
+, ->
+  @echo "POST request has been sent."
+  @test.assertHttpStatus 201
+  jsonData = JSON.parse(@getPageContent())
+  @test.assertEqual jsonData.message, "created", "return created message"
+
+# add entity by post
+casper.thenOpen baseURL + "/admin/rest/adminpage",
+  method: "post"
+  data:
+    title: "title0"
+    url: "url0"
+    pageorder: 0
+    content: "foobar"
+    displaypage: ""
+, ->
+  @echo "POST request has been sent."
+  @test.assertHttpStatus 201
+  jsonData = JSON.parse(@getPageContent())
+  @test.assertEqual jsonData.message, "created", "return created message"
+
+casper.wait 1000, ->
+  @echo "I've waited for a second."
+
+casper.thenOpen baseURL + "/admin/rest/adminpage", ->
+  @test.assertHttpStatus 200
+  jsonData = JSON.parse(@getPageContent())
+  @test.assertEqual jsonData.items[0].displaypage, false, "displaypage of the first entity should be false"
+  @test.assertEqual jsonData.items[0].title, "title0", "title of the first entity should be title0"
+  @test.assertEqual jsonData.items[0].url, "url0", "url of the first entity should be url0"
+  @test.assertEqual jsonData.items[0].pageorder, 0, "content of the first entity should be 0"
+  @test.assertEqual jsonData.items[0].content, "foobar", "title of the first entity should be foobar"
+  @test.assertEqual jsonData.items[1].displaypage, true, "displaypage of the first entity should be true"
+  @test.assertEqual jsonData.items[1].title, "title1", "title of the first entity should be title1"
+  @test.assertEqual jsonData.items[1].url, "url1", "url of the first entity should be url1"
+  @test.assertEqual jsonData.items[1].pageorder, 1, "content of the first entity should be 1"
+  @test.assertEqual jsonData.items[1].content, "foobar", "title of the first entity should be foobar"
+
+
+casper.thenOpen baseURL + "/admin/rest/adminpage/url0",
+  method: "delete"
+, ->
+  @echo "DELETE request has been sent."
+  @test.assertHttpStatus 200
+  jsonData = JSON.parse(@getPageContent())
+  @test.assertEqual jsonData.message, "deleted", "return deleted message"
+
+casper.thenOpen baseURL + "/admin/rest/adminpage/url1",
+  method: "delete"
+, ->
+  @echo "DELETE request has been sent."
+  @test.assertHttpStatus 200
+  jsonData = JSON.parse(@getPageContent())
+  @test.assertEqual jsonData.message, "deleted", "return deleted message"
+
+# add entity by post
+casper.thenOpen baseURL + "/admin/rest/adminpage",
+  method: "post"
+  data:
+    title: "title1"
+    url: "url1"
+    pageorder: 1
+    content: "foobar"
+    displaypage: "on"
+, ->
+  @echo "POST request has been sent."
+  @test.assertHttpStatus 201
+  jsonData = JSON.parse(@getPageContent())
+  @test.assertEqual jsonData.message, "created", "return created message"
+
+casper.thenOpen baseURL + "/admin/rest/adminpage",
+  method: "post"
+  data:
+    title: "title0"
+    url: "url0"
+    pageorder: 0
+    content: "foobar"
+    displaypage: ""
+, ->
+  @echo "POST request has been sent."
+  @test.assertHttpStatus 201
+  jsonData = JSON.parse(@getPageContent())
+  @test.assertEqual jsonData.message, "created", "return created message"
+
+casper.thenOpen baseURL + "/admin/form/#/adminpage/list", ->
+  @test.assertHttpStatus 200
+
+casper.waitForSelector "tr td:first-child", ->
+  tempArr = @getElementsInfo("tr td:first-child")
+  @test.assertEqual tempArr.length isnt 0, true, "check table list"
+
+casper.then ->
+  @click "#createEntity"
+
+casper.waitForSelector "form.form-horizontal", ->
+  @fill "form.form-horizontal",
+    displaypage: true
+    title: "title999"
+    url: "url999"
+    pageorder: 999
+    content: "content999"
+    externalurl: "link999"
+  , true
+
+casper.waitForSelector "tr td:first-child", ->
+  tempArr = @getElementsInfo("tr td:first-child")
+  @test.assertEqual tempArr.length isnt 0, true, "check table list"
+  @mouseEvent "click", "tr td:nth-child(3) a:first-child"
+
+casper.waitForSelector "form.form-horizontal", ->
+  @fill "form.form-horizontal",
+    displaypage: false
+  , true
+
+casper.waitForSelector "tr td:first-child", ->
+  @mouseEvent "click", "tr td:nth-child(3) a:first-child"
+
+casper.waitForSelector "form.form-horizontal", ->
+  @test.assertEqual false, @getFormValues("form.form-horizontal").displaypage, "check data update"
+
+i = 0
+casper.repeat 30, ->
+  i++
+  @thenOpen baseURL + "/admin/rest/adminpage",
+    method: "post"
+    data:
+      title: "title" + i
+      url: "url" + i
+      pageorder: i
+      content: "foobar"
+      displaypage: "on"
+  , ->
+    @echo "POST request has been sent."
+    @test.assertHttpStatus 201
+    jsonData = JSON.parse(@getPageContent())
+    @test.assertEqual jsonData.message, "created", "return created message"
+
+#change offset value to match to perPage value in admin.go
+casper.thenOpen baseURL + "/admin/form/#/adminpage/list", ->
+  @test.assertHttpStatus 200
+  @test.assertExists "#nextButton", "found next button"
+  @click "#nextButton"
+  @test.assertEqual @getCurrentUrl(), baseURL + "/admin/form/#/adminpage/list/20", "next button works"
+
+casper.waitForSelector "#previousButton", ->
+  @test.assertEqual @exists("#nextButton"), false, "not found next button"
+  @click "#previousButton"
+  @test.assertEqual @getCurrentUrl(), baseURL + "/admin/form/#/adminpage/list", "previous button works"
+
+casper.waitForSelector "tr td:first-child", ->
+  @mouseEvent "click", "tr td:nth-child(4) button"
+
+casper.setFilter "page.confirm", (message) ->
+  self.received = message
+  @echo "message to confirm : " + message
+  true
+
+# test of /admin/rest/schema/adminpage
+casper.thenOpen baseURL + "/admin/rest/schema/article", ->
+  @test.assertHttpStatus 200
+  jsonData = JSON.parse(@getPageContent())
+
+#this.test.assertEqual(jsonData.fields.length,9,'total count of models should be 9');
+#this.test.assertEqual(jsonData.model_name,'adminpage','title should be adminpage');
+
+# add entity by post
+casper.thenOpen baseURL + "/admin/rest/article",
+  method: "post"
+  data:
+    title: "title1"
+    url: "url1"
+    displaytime: "2014-07-25 12:00"
+    pageorder: 1
+    content: "foobar"
+    tagstring: "tag"
+    displaypage: "on"
+, ->
+  @echo "POST request has been sent."
+  @test.assertHttpStatus 201
+  jsonData = JSON.parse(@getPageContent())
+  @test.assertEqual jsonData.message, "created", "return created message"
+
+# add entity by post
+casper.thenOpen baseURL + "/admin/rest/article",
+  method: "post"
+  data:
+    title: "title0"
+    url: "url0"
+    displaytime: "2014-07-25 12:01"
+    pageorder: 0
+    content: "foobar"
+    tagstring: "tag0"
+    displaypage: ""
+, ->
+  @echo "POST request has been sent."
+  @test.assertHttpStatus 201
+  jsonData = JSON.parse(@getPageContent())
+  @test.assertEqual jsonData.message, "created", "return created message"
+
+casper.wait 1000, ->
+  @echo "I've waited for a second."
+
+casper.thenOpen baseURL + "/admin/rest/article", ->
+  @test.assertHttpStatus 200
+  jsonData = JSON.parse(@getPageContent())
+  @test.assertEqual jsonData.items[0].displaypage, false, "displaypage of the first entity should be false"
+  @test.assertEqual jsonData.items[0].title, "title0", "title of the first entity should be title0"
+  @test.assertEqual jsonData.items[0].url, "url0", "url of the first entity should be url0"
+  @test.assertEqual jsonData.items[0].pageorder, 0, "content of the first entity should be 0"
+  @test.assertEqual jsonData.items[0].content, "foobar", "title of the first entity should be foobar"
+  @test.assertEqual jsonData.items[0].displaytime.replace("T", " ").slice(0, 16), "2014-07-25 12:01", "title of the first entity should be foobar"
+
+casper.thenOpen baseURL + "/admin/rest/article/url0",
+  method: "delete"
+, ->
+  @echo "DELETE request has been sent."
+  @test.assertHttpStatus 200
+  jsonData = JSON.parse(@getPageContent())
+  @test.assertEqual jsonData.message, "deleted", "return deleted message"
+
+casper.thenOpen baseURL + "/admin/rest/article/url1",
+  method: "delete"
+, ->
+  @echo "DELETE request has been sent."
+  @test.assertHttpStatus 200
+  jsonData = JSON.parse(@getPageContent())
+  @test.assertEqual jsonData.message, "deleted", "return deleted message"
+
+casper.thenOpen baseURL + "/admin/form/#/article/list", ->
+  @test.assertHttpStatus 200
+
+casper.then ->
+  @click "#createEntity"
+
+casper.waitForSelector "form.form-horizontal", ->
+  @fill "form.form-horizontal",
+    displaypage: true
+    title: "title999"
+    url: "url999"
+    displaytime: "2014-07-25 12:01"
+    pageorder: 999
+    content: "content999"
+    tagstring: "tag0"
+    externalurl: "link999"
+  , false
+  @mouseEvent "click", "#submitButton"
+
+j = 0
+casper.repeat 30, ->
+  j++
+  @thenOpen baseURL + "/admin/rest/article",
+    method: "post"
+    data:
+      title: "title" + j
+      url: "url" + j
+      displaytime: "2014-07-25 12:01"
+      pageorder: j
+      content: "foobar"
+      tagstring: "tag" + j
+      displaypage: "on"
+  , ->
+    @echo "POST request has been sent."
+    @test.assertHttpStatus 201
+    jsonData = JSON.parse(@getPageContent())
+    @test.assertEqual jsonData.message, "created", "return created message"
+
+#change offset value to match to perPage value in admin.go
+casper.thenOpen baseURL + "/admin/form/#/article/list", ->
+  @test.assertHttpStatus 200
+  @test.assertExists "#nextButton", "found next button"
+  @click "#nextButton"
+  @test.assertEqual @getCurrentUrl(), baseURL + "/admin/form/#/article/list/20", "next button works"
+
+casper.waitForSelector "#previousButton", ->
+  @test.assertEqual @exists("#nextButton"), false, "not found next button"
+  @click "#previousButton"
+  @test.assertEqual @getCurrentUrl(), baseURL + "/admin/form/#/article/list", "previous button works"
+
+casper.waitForSelector "tr td:first-child", ->
+  @mouseEvent "click", "tr td:nth-child(4) button"
+
+casper.setFilter "page.confirm", (message) ->
+  self.received = message
+  @echo "message to confirm : " + message
+  true
+
+casper.run()


Fixed datetime xAxis issues

Fixed datetime xAxis issues


Add promise argument-check tests and event test specs.

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


Adds ExpressionPosition class to represent places that expression is pointed to

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

--- math/expression_position_spec.coffee
+++ math/expression_position_spec.coffee
@@ -0,0 +1,23 @@
+#= require lib/math/expression_position
+
+describe "expression position library", ->
+  beforeEach ->
+    @builder = ttm.require('lib/math/build_expression_from_javascript_object').build().
+      builderFunction()
+    @ep_builder = ttm.lib.math.ExpressionPosition
+
+  it "holds a reference to the expression", ->
+    ep = @ep_builder.build(expression: 'face')
+    expect(ep.expression()).toEqual 'face'
+
+  it "holds the id of the node that is currently being pointed to", ->
+    ep = @ep_builder.build(position: 10)
+    expect(ep.position()).toEqual 10
+
+
+  describe "building with pointer at end of expression", ->
+    it "sets the pointer", ->
+      basic = @builder()
+      output = @ep_builder.builderFunctionForExpressionPositionAsLast(basic)
+      expect(output.expression()).toBeAnEqualExpressionTo(basic)
+      expect(output.position()).toEqual(basic.id())


Disabled the logs graph. (#2197)

Disabled the logs graph. (#2197)

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


Stub out image helper functionality.

Stub out image helper functionality.

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


Don't remeasure char widths until we've performed initial measurement

--- src/editor-component.coffee
+++ src/editor-component.coffee
@@ -833,7 +833,7 @@
     if @fontSize isnt oldFontSize or @fontFamily isnt oldFontFamily or @lineHeight isnt oldLineHeight
       @measureLineHeightAndDefaultCharWidth()

-    if (@fontSize isnt oldFontSize or @fontFamily isnt oldFontFamily)
+    if (@fontSize isnt oldFontSize or @fontFamily isnt oldFontFamily) and @performedInitialMeasurement
       @remeasureCharacterWidths()

   sampleBackgroundColors: (suppressUpdate) ->


Rename main file

Rename main file

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

--- lib/autocomplete-motion.coffee
+++ lib/autocomplete-motion.coffee
@@ -0,0 +1,22 @@
+provider = require './provider'
+{CompositeDisposable} = require 'atom'
+
+module.exports =
+  activate: ->
+    provider.loadProperties()
+    @disposables = new CompositeDisposable
+    @disposables.add atom.commands.add 'atom-workspace', "RubyMotion: Generate Snippets", @createSelectListView
+
+  createSelectListView: ->
+    RubyMotionSelectListView = require './rubymotion-select-list-view'
+    rubyMotionSelectListView = new RubyMotionSelectListView @
+    rubyMotionSelectListView.attach()
+
+  getProvider: -> provider
+
+  config:
+    supportFileDir:
+      title: 'RubyMotion Install Folder'
+      description: 'This is used to generate the completions for methods, constants, etc...'
+      type: 'string'
+      default: '/Library/RubyMotion/'


refactored marker builder

refactored marker builder

--- vendor/assets/javascripts/gmaps/google/builders/marker.coffee
+++ vendor/assets/javascripts/gmaps/google/builders/marker.coffee
@@ -30,7 +30,7 @@
     @after_init()

   build: ->
-    @object = new(@model_class())(@serviceObject)
+    @marker = new(@model_class())(@serviceObject)

   create_marker: ->
     @serviceObject = new(@primitives().marker)(@marker_options())
@@ -53,17 +53,14 @@

   infowindow_binding: =>
     @constructor.CURRENT_INFOWINDOW.close() if @_should_close_infowindow()
-    @panTo()
+    @marker.panTo()
     @infowindow ?= @create_infowindow()

     return unless @infowindow?

     @infowindow.open( @getServiceObject().getMap(), @getServiceObject())
-    @object.infowindow ?= @infowindow
+    @marker.infowindow ?= @infowindow
     @constructor.CURRENT_INFOWINDOW = @infowindow
-
-  panTo: ->
-    @getServiceObject().getMap().panTo @getServiceObject().getPosition()

   _get_picture: (picture_name)->
     return null if !_.isObject(@args[picture_name]) || !_.isString(@args[picture_name].url)


add comment for 613's req

add comment for 613's req

--- assets/data/quest_goal.cson
+++ assets/data/quest_goal.cson
@@ -249,7 +249,7 @@
   type: 2
   "destory_item":
     description: "廃棄"
-    times: [1]
+    times: [1] # times req is to separate from 638, so 638 own update will not cause this quest update
     required: 24
     init: 0
 703: # 「近代化改修」を進め、戦備を整えよ！ 进行舰船近代化改修15次


Update language-mode

Update language-mode

--- src/app/language-mode.coffee
+++ src/app/language-mode.coffee
@@ -14,18 +14,20 @@
   editSession: null
   currentGrammarScore: null

-  # Public: Sets up a `LanguageMode` for the given {EditSession}.
+  ### Internal ###
+
+  destroy: ->
+    @unsubscribe()
+
+  ### Public ###
+
+  # Sets up a `LanguageMode` for the given {EditSession}.
   #
   # editSession - The {EditSession} to associate with
   constructor: (@editSession) ->
     @buffer = @editSession.buffer

-  # Internal:
-  destroy: ->
-    @unsubscribe()
-
-
-  # Public: Wraps the lines between two rows in comments.
+  # Wraps the lines between two rows in comments.
   #
   # If the language doesn't have comment, nothing happens.
   #
@@ -72,7 +74,7 @@
         for row in [start..end]
           buffer.insert([row, 0], commentStartString)

-  # Public: Folds all the foldable lines in the buffer.
+  # Folds all the foldable lines in the buffer.
   foldAll: ->
     for currentRow in [0..@buffer.getLastRow()]
       [startRow, endRow] = @rowRangeForFoldAtBufferRow(currentRow) ? []
@@ -80,11 +82,16 @@

       @editSession.createFold(startRow, endRow)

-  # Public: Unfolds all the foldable lines in the buffer.
+  # Unfolds all the foldable lines in the buffer.
   unfoldAll: ->
     for row in [@buffer.getLastRow()..0]
       fold.destroy() for fold in @editSession.displayBuffer.foldsStartingAtBufferRow(row)

+  # Given a buffer row, creates a fold at it.
+  #
+  # bufferRow - A {Number} indicating the buffer row
+  #
+  # Returns the new {Fold}.
   foldBufferRow: (bufferRow) ->
     for currentRow in [bufferRow..0]
       rowRange = @rowRangeForCommentAtBufferRow(currentRow)
@@ -94,7 +101,7 @@
       fold = @editSession.displayBuffer.largestFoldStartingAtBufferRow(startRow)
       return @editSession.createFold(startRow, endRow) unless fold

-  # Public: Given a buffer row, this unfolds it.
+  # Given a buffer row, this unfolds it.
   #
   # bufferRow - A {Number} indicating the buffer row
   unfoldBufferRow: (bufferRow) ->
@@ -138,7 +145,7 @@
       endRow = currentRow
     return [startRow, endRow] if startRow isnt endRow

-  # Public: Given a buffer row, this returns a suggested indentation level.
+  # Given a buffer row, this returns a suggested indentation level.
   #
   # The indentation level provided is based on the current {LanguageMode}.
   #
@@ -164,21 +171,21 @@

     Math.max(desiredIndentLevel, currentIndentLevel)

-  # Public: Indents all the rows between two buffer row numbers.
+  # Indents all the rows between two buffer row numbers.
   #
   # startRow - The row {Number} to start at
   # endRow - The row {Number} to end at
   autoIndentBufferRows: (startRow, endRow) ->
     @autoIndentBufferRow(row) for row in [startRow..endRow]

-  # Public: Given a buffer row, this indents it.
+  # Given a buffer row, this indents it.
   #
   # bufferRow - The row {Number}
   autoIndentBufferRow: (bufferRow) ->
     @autoIncreaseIndentForBufferRow(bufferRow)
     @autoDecreaseIndentForBufferRow(bufferRow)

-  # Public: Given a buffer row, this increases the indentation.
+  # Given a buffer row, this increases the indentation.
   #
   # bufferRow - The row {Number}
   autoIncreaseIndentForBufferRow: (bufferRow) ->
@@ -196,7 +203,7 @@
     if desiredIndentLevel > currentIndentLevel
       @editSession.setIndentationForBufferRow(bufferRow, desiredIndentLevel)

-  # Public: Given a buffer row, this decreases the indentation.
+  # Given a buffer row, this decreases the indentation.
   #
   # bufferRow - The row {Number}
   autoDecreaseIndentForBufferRow: (bufferRow) ->


A generally useless spec; but a spec nonetheless

error: pathspec 'components/connect_v2/test/client/view.coffee' did not match any file(s) known to git

--- components/connect_v2/test/client/view.coffee
+++ components/connect_v2/test/client/view.coffee
@@ -0,0 +1,59 @@
+{ resolve } = require 'path'
+benv = require 'benv'
+sinon = require 'sinon'
+Backbone = require 'backbone'
+
+Block = require '../../../../models/block'
+Channels = require '../../../../collections/connection_blocks'
+mediator = require '../../../../lib/mediator'
+
+ConnectView = benv.requireWithJadeify resolve(__dirname, '../../client/view'), []
+ConnectResultsView = benv.requireWithJadeify resolve(__dirname, '../../components/results/view'), []
+ConnectItemView = benv.requireWithJadeify resolve(__dirname, '../../components/item/view'), ['template']
+
+ConnectResultsView.__set__ 'ConnectItemView', ConnectItemView
+ConnectView.__set__ 'ConnectResultsView', ConnectResultsView
+
+describe 'ConnectView', ->
+  before (done) ->
+    mediator.shared = {}
+    mediator.shared.recent_connections = new Backbone.Collection
+    mediator.shared.recent_connections.shove = Backbone.Collection::add
+    mediator.shared.recent_connections.unshove = Backbone.Collection::remove
+
+    benv.setup ->
+      benv.expose
+        $: benv.require 'jquery'
+      Backbone.$ = $
+      done()
+
+  after ->
+    benv.teardown()
+
+  beforeEach ->
+    @view = new ConnectView
+      model: new Block id: 'block1'
+      collection: new Channels [
+        { id: 'channel1', title: 'title1', slug: 'slug1', status: 'private', user: slug: 'user1' }
+      ], user_slug: 'lol'
+
+  it 'renders the view heirarchy', ->
+    html = @view.render().$el.html()
+    html.should.containEql ''
+    html.should.containEql 'title1'
+
+  describe 'when clicked', ->
+    beforeEach ->
+      @view.render()
+      sinon.stub ConnectItemView.__get__('AsyncSerialQueue')::, 'enqueue', (fn) -> fn()
+      sinon.stub $, 'ajax'
+
+    afterEach ->
+      $.ajax.restore()
+      ConnectItemView.__get__('AsyncSerialQueue')::enqueue.restore()
+
+    it 'connects', ->
+      @view.$('.Connect__item').click()
+      $.ajax.callCount.should.equal 1
+      $.ajax.args[0][0].type.should.eql 'POST'
+      $.ajax.args[0][0].url.should.containEql '/channels/channel1/connections'


Fixed bug in the slow implementation of the indexOf method

When the indexOf method cannot be delegated to the native implementation, it uses a pretty simple implementation. However this implementation was buggy…

This may have lead to errors on IE8.

Signed-off-by: Clement Escoffier <6397137e57d1f87002962a37058f2a1c76fca9db@gmail.com>

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


Client: Activity: Test: Created ChannelParticipantsDropdown container component

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

--- client/activity/lib/components/channelparticipantsdropdown/container.coffee
+++ client/activity/lib/components/channelparticipantsdropdown/container.coffee
@@ -0,0 +1,97 @@
+kd             = require 'kd'
+View           = require './view'
+React          = require 'kd-react'
+ReactDOM       = require 'react-dom'
+immutable      = require 'immutable'
+ActivityFlux   = require 'activity/flux'
+scrollToTarget = require 'app/util/scrollToTarget'
+
+module.exports = class ChannelParticipantsDropdownContainer extends React.Component
+
+  @propTypes =
+    visible              : React.PropTypes.bool
+    onItemConfirmed      : React.PropTypes.func
+    className            : React.PropTypes.string
+    selectedIndex        : React.PropTypes.number
+    moveToNextAction     : React.PropTypes.func.isRequired
+    moveToPrevAction     : React.PropTypes.func.isRequired
+    closeAction          : React.PropTypes.func.isRequired
+    onItemSelectedAction : React.PropTypes.func.isRequired
+    DropdownItem         : React.PropTypes.func.isRequired
+    selectedItem         : React.PropTypes.instanceOf immutable.Map
+    items                : React.PropTypes.instanceOf immutable.List
+
+
+  @defaultProps =
+    className            : ''
+    visible              : no
+    selectedIndex        : 0
+    onItemConfirmed      : kd.noop
+    items                : immutable.List()
+    selectedItem         : immutable.Map()
+
+
+  componentDidUpdate: (prevProps, prevState) ->
+
+    { selectedItem, visible } = @props
+
+    return  if prevProps.selectedItem is selectedItem or not selectedItem
+    return  if visible? and not visible
+
+    containerElement = @refs.view.refs.dropbox.getContentElement()
+    itemElement      = ReactDOM.findDOMNode @refs.view.refs[selectedItem.get '_id']
+
+    scrollToTarget containerElement, itemElement
+
+
+  isActive: ->
+
+    { items, visible } = @props
+    visible ?= yes
+    return items.size > 0 and visible
+
+
+  hasSingleItem: -> @props.items.size is 1
+
+
+  confirmSelectedItem: ->
+
+    selectedValue = @formatSelectedValue()
+    @props.onItemConfirmed? selectedValue
+    @close()
+
+
+  moveToPrevPosition: ->
+
+    @props.moveToPrevAction()  unless @hasSingleItem()
+    return yes
+
+
+  moveToNextPosition: ->
+
+    @props.moveToNextAction()  unless @hasSingleItem()
+    return yes
+
+
+  onItemSelected: (index) -> @props.onItemSelectedAction index
+
+
+  close: -> @props.closeAction no
+
+
+  formatSelectedValue: -> "@#{@props.selectedItem.getIn ['profile', 'nickname']}"
+
+
+  render: ->
+
+    <View
+      ref                 = 'view'
+      visible             = { @isActive() }
+      items               = { @props.items }
+      onClose             = { @bound 'close' }
+      className           = { @props.className }
+      DropdownItem        = { @props.DropdownItem }
+      selectedIndex       = { @props.selectedIndex }
+      onItemSelected      = { @bound 'onItemSelected' }
+      confirmSelectedItem = { @bound 'confirmSelectedItem' } />
+


Social: create bridge functions for sending requests ftp the social api

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


add presentations widget

add presentations widget

error: pathspec 'rtm_presentations.widget/main.coffee' did not match any file(s) known to git

--- rtm_presentations.widget/main.coffee
+++ rtm_presentations.widget/main.coffee
@@ -0,0 +1,54 @@
+command: "sleep 15 | /Users/yina/.pyenv/shims/python /Users/yina/Dropbox/Backups/geektool/ubersicht_widgets/bin/rtm_cli.py -c -p ls list:sl_presentations priority:1"
+
+refreshFrequency: 10000
+
+style: """
+  top: 450px
+  left: 750px
+
+	*
+		margin 0
+		padding 0
+
+	#container1
+		margin 0
+		padding 0
+		color rgba(#fff, .9)
+		font-family Lucida Grande
+		font-size 10pt
+
+	ul
+		list-style none
+
+	li
+		padding 10px
+		&:not(:last-child)
+			border-bottom solid 1px white
+
+	tbody
+		font-size 12pt
+
+  td
+  	width 60px
+   text-align right
+
+"""
+
+render: (output) -> """
+

+

+

+

+

+     PRESENTATIONS-MEETINGS-TEACHING
+

+

+

+       #{output}
+

+

+

+

+

+

+"""


Expect the deserialization promise to reject with inaccessible dirs

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


An address range is relative iff both addresses are relative

--- src/extensions/command-interpreter/address-range.coffee
+++ src/extensions/command-interpreter/address-range.coffee
@@ -9,4 +9,4 @@
     new Range(@startAddress.getRange(editor, currentRange).start, @endAddress.getRange(editor, currentRange).end)

   isRelative: ->
-    @startAddress.isRelative() or @endAddress.isRelative()
+    @startAddress.isRelative() and @endAddress.isRelative()


Allow default to include space settings

Allow default to include space settings

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


fix carousel, use the new events changed with twitter bootstrap 3

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


forgot to add health check controller

forgot to add health check controller

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

--- app/coffee/HealthCheckController.coffee
+++ app/coffee/HealthCheckController.coffee
@@ -0,0 +1,46 @@
+ObjectId = require("mongojs").ObjectId
+request = require("request")
+async = require("async")
+_ = require("underscore")
+crypto = require("crypto")
+settings = require("settings-sharelatex")
+port = settings.internal.tags.port
+logger = require "logger-sharelatex"
+
+
+module.exports =
+	check : (callback)->
+		project_id = ObjectId()
+		user_id = ObjectId(settings.internal.tags.healthCheck.user_id)
+		tagName = "smoke-test-tag"
+		getOpts = (endPath)-> {url:"http://localhost:#{port}/user/#{user_id}#{endPath}", timeout:3000}
+		logger.log user_id:user_id, opts:getOpts(), tagName:tagName, project_id:project_id, "running health check"
+		jobs = [
+			(cb)->
+				opts = getOpts("/project/#{project_id}/tag")
+				opts.json = {name: tagName}
+				request.post(opts, cb)
+			(cb)->
+				opts = getOpts("/tag")
+				opts.json = true
+				request.get opts, (err, res, body)->
+					console.log body, tagName
+
+					if res.statusCode != 200
+						return cb("status code not 200, its #{res.statusCode}")
+
+					hasTag = _.some body, (tag)->
+						console.log tag.name == tagName, tagName
+						console.log _.contains(tag.project_ids, project_id.toString()), tag.project_ids, project_id
+						tag.name == tagName and _.contains(tag.project_ids, project_id.toString())
+					if hasTag
+						cb()
+					else
+						cb("tag not found in response")
+		]
+		async.series jobs, (err)->
+			if err?
+				callback(err)
+			opts = getOpts("/project/#{project_id}/tag")
+			opts.json = {name: tagName}
+			request.del opts, callback


Changed couchdb implementation to coffeescript

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

--- src/server/db/couchdb.coffee
+++ src/server/db/couchdb.coffee
@@ -0,0 +1,110 @@
+# OT storage for CouchDB
+# Author: Max Ogden (@maxogden)
+
+request = require('request').defaults json: true
+_ = require 'underscore'
+
+defaults =
+  port: 5984
+  hostname: "http://localhost"
+  db: "ot"
+
+encodeOptions = (options) ->
+  buf = []
+  if options? and typeof options is "object"
+    for own name, value of options
+      value = JSON.stringify value if name in ['key', 'startkey', 'endkey']
+
+      buf.push "#{encodeURIComponent(name)}=#{encodeURIComponent(value)}"
+
+  if buf.length is 0
+    ""
+  else
+    "?" + buf.join "&"
+
+module.exports = (options) ->
+  options = _.extend {}, defaults, options
+
+  db = options.hostname + ":" + options.port + '/' + options.db
+  ops = db + '/_design/sharejs/_view/operations'
+
+  getOps: (docName, start, end, callback) ->
+    return callback null, [] if start == end
+
+    # Its a bit gross having this end parameter here....
+    if end then end-- else end = 999999
+
+    request uri: ops + encodeOptions(startkey: [docName, start], endkey: [docName, end], include_docs: true), (err, resp, body) ->
+      # Can we just return row.doc? What else is in it?
+      data = ({op: row.doc.op, meta: row.doc.meta, v: row.doc.v} for row in body.rows)
+      callback null, data
+
+  # in the context of couchdb mapreduce this create function doesn't
+  # really make sense, since the existence of operations is an implicit
+  # indicator that a document exists and each op gets it's own doc.
+  # regardless, to make the test suite pass, im storing 'document' documents
+  create: (docName, data, callback) ->
+    throw new Error 'snapshot missing from data' unless data.snapshot != undefined
+    throw new Error 'type missing from data' unless data.type != undefined
+    throw new Error 'version missing from data' unless typeof data.v == 'number'
+    throw new Error 'meta missing from data' unless typeof data.meta == 'object'
+
+    doc = {_id: docName, type: "document", data}
+    request.post uri: db, body: doc, (err, resp, body) ->
+      if err
+        callback? err, false
+      else if body.ok
+        callback? null, true
+      else
+        if body.error is "conflict"
+          callback? 'Document already exists', false
+        else
+          callback? body.error + ' reason: ' + body.reason, false
+
+  delete: (docName, callback) ->
+    request "#{db}/#{docName}", (err, resp, body) ->
+      return callback? 'Document does not exist', false if resp.statusCode is 404
+
+      docs = [_.extend({}, body, {_deleted: true})]
+      # Again with the hard version number limit. Version numbers can actually get really large - a couple hours of editing
+      # easily pushes 10k ops.
+      request uri: ops + encodeOptions({startkey:[docName,0], endkey:[docName,999999], include_docs: true}), (err, resp, body) ->
+        docs.push _.extend({}, row.doc, {_deleted: true}) for row in body.rows
+
+        request.post {url: db + '/_bulk_docs', body: {docs}}, (err, resp, body) ->
+          if err
+            callback? err, false
+          else
+            callback? null, true
+
+  append: (docName, opData, docData, callback) ->
+    throw new Error 'snapshot missing from data' unless docData.snapshot != undefined
+    throw new Error 'type missing from data' unless docData.type != undefined
+
+    request "#{db}/#{docName}", (err, resp, body) ->
+      return callback? 'Document does not exist' if resp.statusCode is 404
+
+      body.data = docData
+      request.post url: db, body: body, (err, resp, body) ->
+        opData.docName = docName
+        request.post {uri: db, body: opData}, (err, resp, body) ->
+          if body?.ok
+            callback?()
+          else
+            callback? err or body.error
+
+  getSnapshot: (docName, callback) ->
+    request "#{db}/#{docName}", (err, resp, body) ->
+      if resp.statusCode is 404
+        callback 'Document does not exist'
+      else
+        callback null, body.data
+
+  getVersion: (docName, callback) ->
+    request "#{db}/#{docName}", (err, resp, body) ->
+      if resp.statusCode is 404
+        callback 'Document does not exist'
+      else
+        callback null, body.data.v
+
+  close: ->


Removed the start and stop methods from the LevelDBServer class because they did nothing different then the parent class's 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/Industrial/id-server.git/'


Change output directory for library module catalog entries

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


inject supersonic to the controller

inject supersonic to the controller

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


Replace fuzzy-finder with fuzzyFinder in spec config key path

--- src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee
+++ src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee
@@ -251,28 +251,17 @@
         expect(rootView.project.getFilePaths).toHaveBeenCalled()

   describe "path ignoring", ->
-    it "ignores paths that match entries in config.fuzzy-finder.ignoredNames", ->
+    it "ignores paths that match entries in config.fuzzyFinder.ignoredNames", ->
       spyOn(rootView.project, "getFilePaths").andCallThrough()
-      config.set("fuzzy-finder.ignoredNames", ["tree-view"])
+      config.set("fuzzyFinder.ignoredNames", ["tree-view.js"])
       rootView.trigger 'fuzzy-finder:toggle-file-finder'
       finder.maxItems = Infinity
-      finder.miniEditor.setText("file1")
-
-      waitsFor ->
-        finder.list.children('li').length > 0
-
-      runs ->
-        expect(rootView.project.getFilePaths).toHaveBeenCalled()
-        rootView.project.getFilePaths.reset()
-        $(window).trigger 'focus'
-        rootView.trigger 'fuzzy-finder:toggle-file-finder'
-        rootView.trigger 'fuzzy-finder:toggle-file-finder'
-
-      waitsFor ->
-        finder.list.children('li').length > 0
-
-      runs ->
-        expect(rootView.project.getFilePaths).toHaveBeenCalled()
+
+      waitsFor ->
+        finder.list.children('li').length > 0
+
+      runs ->
+        expect(finder.list.find("li:contains(tree-view.js)")).not.toExist()

   describe "opening a path into a split", ->
     beforeEach ->


Only require git if exluding ignored files

--- src/packages/fuzzy-finder/src/load-paths-handler.coffee
+++ src/packages/fuzzy-finder/src/load-paths-handler.coffee
@@ -1,11 +1,13 @@
 fs = require 'fs'
 _ = require 'underscore'
-Git = require 'git'

 module.exports =
   loadPaths: (rootPath, ignoredNames, excludeGitIgnoredPaths) ->
+    if excludeGitIgnoredPaths
+      Git = require 'git'
+      repo = Git.open(rootPath, refreshIndexOnFocus: false)
+
     paths = []
-    repo = Git.open(rootPath, refreshIndexOnFocus: false) if excludeGitIgnoredPaths
     isIgnored = (path) ->
       for segment in path.split('/')
         return true if _.contains(ignoredNames, segment)
@@ -15,5 +17,7 @@
     onDirectory = (path) ->
       not isIgnored(path)
     fs.traverseTree(rootPath, onFile, onDirectory)
+
     repo?.destroy()
+
     callTaskMethod('pathsLoaded', paths)


Mini editor's don't toggle active-editor-path-change event

--- src/app/root-view.coffee
+++ src/app/root-view.coffee
@@ -106,13 +106,13 @@
   makeEditorActive: (editor) ->
     previousActiveEditor = @panes.find('.editor.active').view()
     previousActiveEditor?.removeClass('active').off('.root-view')
-    editor
-      .addClass('active')
-      .on 'editor-path-change.root-view', =>
+    editor.addClass('active')
+
+    if not editor.mini
+      editor.on 'editor-path-change.root-view', =>
         @trigger 'active-editor-path-change', editor.buffer.path
-
-    if not previousActiveEditor or editor.buffer.path != previousActiveEditor.buffer.path
-      @trigger 'active-editor-path-change', editor.buffer.path
+      if not previousActiveEditor or editor.buffer.path != previousActiveEditor.buffer.path
+        @trigger 'active-editor-path-change', editor.buffer.path

   activeKeybindings: ->
     keymap.bindingsForElement(document.activeElement)


Ensure tab-stops are correctly placed on indented snippet lines

--- spec/extensions/snippets-spec.coffee
+++ spec/extensions/snippets-spec.coffee
@@ -30,7 +30,7 @@

         snippet t3 "With indented second line"
         line 1
-          line 2
+          line 2$1

         endsnippet
       """
@@ -88,6 +88,7 @@
           editor.trigger 'snippets:expand'
           expect(buffer.lineForRow(2)).toBe "    if (items.length <= 1) return items; line 1"
           expect(buffer.lineForRow(3)).toBe "      line 2"
+          expect(editor.getCursorBufferPosition()).toEqual [3, 12]

     describe "when the letters preceding the cursor don't match a snippet", ->
       it "inserts a tab as normal", ->


Increase default line height even a bit more

--- src/config-schema.coffee
+++ src/config-schema.coffee
@@ -108,7 +108,7 @@
         maximum: 100
       lineHeight:
         type: ['string', 'number']
-        default: 1.44
+        default: 1.5
       showInvisibles:
         type: 'boolean'
         default: false


required "default" fields for api Umbrella user create changed

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


Visual/edit modes: exit visual mode on click in input element.

--- content_scripts/mode_visual_edit.coffee
+++ content_scripts/mode_visual_edit.coffee
@@ -449,15 +449,20 @@
           @changeMode CaretMode
           return

-    # Yank on <Enter>.
     @push
-      _name: "#{@id}/enter"
+      _name: "#{@id}/enter/click"
+      # Yank on <Enter>.
       keypress: (event) =>
         if event.keyCode == keyCodes.enter
           unless event.metaKey or event.ctrlKey or event.altKey or event.shiftKey
             @yank()
             return @suppressEvent
         @continueBubbling
+      # Click in a focusable element exits.
+      click: (event) =>
+        @alwaysContinueBubbling =>
+          unless @options.parentMode
+            @exit event, event.target if DomUtils.isFocusable event.target

     # Visual-mode commands.
     unless @options.oneMovementOnly
@@ -494,7 +499,7 @@
       # Don't leave the user in insert mode just because they happen to have selected text within an input
       # element.
       if document.activeElement and DomUtils.isEditable document.activeElement
-        document.activeElement.blur()
+        document.activeElement.blur() unless event?.type == "click"

     super event, target
     if @yankedText?
@@ -553,6 +558,13 @@

     @selection.modify "extend", forward, character
     @scrollIntoView()
+
+    @push
+      _name: "#{@id}/click"
+      # Click in a focusable element exits.
+      click: (event) =>
+        @alwaysContinueBubbling =>
+          @exit event, event.target if DomUtils.isFocusable event.target

     extend @commands,
       v: -> @changeMode VisualMode


Fix _cursorRight when on right edge of screen

--- app/assets/javascripts/player/vt.js.coffee
+++ app/assets/javascripts/player/vt.js.coffee
@@ -462,7 +462,7 @@
       @updateLine()

   _cursorRight: ->
-    if @cursorX < @cols
+    if @cursorX < @cols - 1
       @cursorX += 1
       @updateLine()


Handle more standard esc sequences

Handle more standard esc sequences

--- app/assets/javascripts/player/vt.js.coffee
+++ app/assets/javascripts/player/vt.js.coffee
@@ -82,31 +82,42 @@
         @carriageReturn()

       when "\x84"
-        @index() # "D"
+        @index() # "ESC D"
       when "\x85"
-        @newLine() # "E"
+        @newLine() # "ESC E"
       when "\x88"
-        @setHorizontalTabStop() # "H"
+        @setHorizontalTabStop() # "ESC H"
       when "\x8d"
-        @reverseIndex() # "M"
+        @reverseIndex() # "ESC M"

   handlePrintableCharacters: (text) ->
     @buffer.print text

   handleStandardEscSeq: (data) ->
     last = data[data.length - 1]
-
-    if last.match(/[\x40-\x5f]/)
-      # convert to C1
-      char = String.fromCharCode(last.charCodeAt(0) + 0x40)
-      @handleControlCharacter(char)
-    else
-      switch last
-        when "c"
-          @resetTerminal()
+    intermediate = data[data.length - 2]
+
+    switch last
+      when "A"
+        if intermediate is '('
+          @setUkCharset()
+      when "B"
+        if intermediate is '('
+          @setUsCharset()
+      when "D"
+        @index()
+      when "E"
+        @newLine()
+      when "H"
+        @setHorizontalTabStop()
+      when "M"
+        @reverseIndex()
+      when "c"
+        @resetTerminal()

   handlePrivateEscSeq: (data) ->
     last = data[data.length - 1]
+    intermediate = data[data.length - 2]

     switch last
       when "0"


fix typo

fix typo

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


new test

new test

Former-commit-id: 88998279cb183804898c91a79b364109e16dec4e [formerly ab3509f298d9b56a1f30a97c020fb1dd33cfd093]
Former-commit-id: 0402e724793bdc2301e65ec04148e1546e16c81e

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

--- tests/test_utils_str.coffee
+++ tests/test_utils_str.coffee
@@ -0,0 +1,13 @@
+define ["cs!utils/strings"], (Str) ->
+
+  module "utils.string"
+
+  test "str contains", ->
+
+    equal( false, Str.contains "a", "b")
+    equal( true, Str.contains "a", "a")
+
+    equal( true, Str.contains "xxbaxx", "ba")
+    equal( false, Str.contains "xxbaxx", "c")
+
+    equal( false, Str.contains "", "a")