{"action":"created","comment":{"url":"https://api.github.com/repos/musescore/MuseScore/pulls/comments/37096149","id":37096149,"diff_hunk":"@@ -1,423 +1,480 @@\n-//=============================================================================\n-//  MuseScore\n-//  Music Composition & Notation\n-//\n-//  Copyright (C) 2009-2011 Werner Schweer\n-//\n-//  This program is free software; you can redistribute it and/or modify\n-//  it under the terms of the GNU General Public License version 2\n-//  as published by the Free Software Foundation and appearing in\n-//  the file LICENCE.GPL\n-//=============================================================================\n-\n-#include \"repeatlist.h\"\n-#include \"score.h\"\n-#include \"measure.h\"\n-#include \"tempo.h\"\n-#include \"volta.h\"\n-#include \"segment.h\"\n-#include \"marker.h\"\n-#include \"jump.h\"\n-\n-namespace Ms {\n-\n-//---------------------------------------------------------\n-//   searchVolta\n-//    return volta at tick\n-//---------------------------------------------------------\n-\n-Volta* Score::searchVolta(int tick) const\n-      {\n-      for (const std::pair<int,Spanner*>& p : _spanner.map()) {\n-            Spanner* s = p.second;\n-            if (s->type() != Element::Type::VOLTA)\n-                  continue;\n-            Volta* volta = static_cast<Volta*>(s);\n-            if (tick >= volta->tick() && tick < volta->tick2())\n-                  return volta;\n-            }\n-      return 0;\n-      }\n-\n-//---------------------------------------------------------\n-//   searchLabel\n-//---------------------------------------------------------\n-\n-Measure* Score::searchLabel(const QString& s)\n-      {\n-      if (s == \"start\")\n-            return firstMeasure();\n-      else if (s == \"end\")\n-            return lastMeasure();\n-      for (Measure* m = firstMeasure(); m; m = m->nextMeasure()) {\n-            for (auto e : m->el()) {\n-                  if (e->type() == Element::Type::MARKER) {\n-                        const Marker* marker = static_cast<const Marker*>(e);\n-                        if (marker->label() == s)\n-                              return m;\n-                        }\n-                  }\n-            }\n-      return 0;\n-      }\n-\n-//---------------------------------------------------------\n-//   RepeatLoop\n-//---------------------------------------------------------\n-\n-struct RepeatLoop {\n-      enum class LoopType : char { REPEAT, JUMP };\n-\n-      LoopType type;\n-      Measure* m;   // start measure of LoopType::REPEAT\n-      int count;\n-      QString stop, cont;\n-\n-      RepeatLoop() {}\n-      RepeatLoop(Measure* _m)  {\n-            m     = _m;\n-            count = 0;\n-            type  = LoopType::REPEAT;\n-            }\n-      RepeatLoop(const QString s, const QString c)\n-         : stop(s), cont(c)\n-            {\n-            m    = 0;\n-            type = LoopType::JUMP;\n-            }\n-      };\n-\n-//---------------------------------------------------------\n-//   RepeatSegment\n-//---------------------------------------------------------\n-\n-RepeatSegment::RepeatSegment()\n-      {\n-      tick       = 0;\n-      len        = 0;\n-      utick      = 0;\n-      utime      = 0.0;\n-      timeOffset = 0.0;\n-      }\n-\n-//---------------------------------------------------------\n-//   RepeatList\n-//---------------------------------------------------------\n-\n-RepeatList::RepeatList(Score* s)\n-      {\n-      _score = s;\n-      idx1  = 0;\n-      idx2  = 0;\n-      }\n-\n-//---------------------------------------------------------\n-//   ticks\n-//---------------------------------------------------------\n-\n-int RepeatList::ticks()\n-      {\n-      if (length() > 0) {\n-            RepeatSegment* s = last();\n-            return s->utick + s->len;\n-            }\n-      return 0;\n-      }\n-\n-//---------------------------------------------------------\n-//   update\n-//---------------------------------------------------------\n-\n-void RepeatList::update()\n-      {\n-      const TempoMap* tl = _score->tempomap();\n-\n-      int utick = 0;\n-      qreal t  = 0;\n-\n-      for(RepeatSegment* s : *this) {\n-            s->utick      = utick;\n-            s->utime      = t;\n-            qreal ct      = tl->tick2time(s->tick);\n-            s->timeOffset = t - ct;\n-            utick        += s->len;\n-            t            += tl->tick2time(s->tick + s->len) - ct;\n-            }\n-      }\n-\n-//---------------------------------------------------------\n-//   utick2tick\n-//---------------------------------------------------------\n-\n-int RepeatList::utick2tick(int tick) const\n-      {\n-      unsigned n = size();\n-      if (n == 0)\n-            return tick;\n-      if (tick < 0)\n-            return 0;\n-      unsigned ii = (idx1 < n) && (tick >= at(idx1)->utick) ? idx1 : 0;\n-      for (unsigned i = ii; i < n; ++i) {\n-            if ((tick >= at(i)->utick) && ((i + 1 == n) || (tick < at(i+1)->utick))) {\n-                  idx1 = i;\n-                  return tick - (at(i)->utick - at(i)->tick);\n-                  }\n-            }\n-      if (MScore::debugMode) {\n-            qFatal(\"tick %d not found in RepeatList\", tick);\n-            }\n-      return 0;\n-      }\n-\n-//---------------------------------------------------------\n-//   tick2utick\n-//---------------------------------------------------------\n-\n-int RepeatList::tick2utick(int tick) const\n-      {\n-      for (const RepeatSegment* s : *this) {\n-            if (tick >= s->tick && tick < (s->tick + s->len))\n-                  return s->utick + (tick - s->tick);\n-            }\n-      return last()->utick + (tick - last()->tick);\n-      }\n-\n-//---------------------------------------------------------\n-//   utick2utime\n-//---------------------------------------------------------\n-\n-qreal RepeatList::utick2utime(int tick) const\n-      {\n-      unsigned n = size();\n-      unsigned ii = (idx1 < n) && (tick >= at(idx1)->utick) ? idx1 : 0;\n-      for (unsigned i = ii; i < n; ++i) {\n-            if ((tick >= at(i)->utick) && ((i + 1 == n) || (tick < at(i+1)->utick))) {\n-                  int t     = tick - (at(i)->utick - at(i)->tick);\n-                  qreal tt = _score->tempomap()->tick2time(t) + at(i)->timeOffset;\n-                  return tt;\n-                  }\n-            }\n-      return 0.0;\n-      }\n-\n-//---------------------------------------------------------\n-//   utime2utick\n-//---------------------------------------------------------\n-\n-int RepeatList::utime2utick(qreal t) const\n-      {\n-      unsigned n = size();\n-      unsigned ii = (idx2 < n) && (t >= at(idx2)->utime) ? idx2 : 0;\n-      for (unsigned i = ii; i < n; ++i) {\n-            if ((t >= at(i)->utime) && ((i + 1 == n) || (t < at(i+1)->utime))) {\n-                  idx2 = i;\n-                  return _score->tempomap()->time2tick(t - at(i)->timeOffset) + (at(i)->utick - at(i)->tick);\n-                  }\n-            }\n-      if (MScore::debugMode) {\n-            qFatal(\"time %f not found in RepeatList\", t);\n-            }\n-      return 0;\n-      }\n-\n-//---------------------------------------------------------\n-//   dump\n-//---------------------------------------------------------\n-\n-void RepeatList::dump() const\n-      {\n-#if 0\n-      qDebug(\"==Dump Repeat List:==\");\n-      foreach(const RepeatSegment* s, *this) {\n-            qDebug(\"%p  tick: %3d(%d) %3d(%d) len %d(%d) beats  %f + %f\", s,\n-               s->utick / MScore::division,\n-               s->utick / MScore::division / 4,\n-               s->tick / MScore::division,\n-               s->tick / MScore::division / 4,\n-               s->len / MScore::division,\n-               s->len / MScore::division / 4,\n-               s->utime, s->timeOffset);\n-            }\n-#endif\n-      }\n-\n-//---------------------------------------------------------\n-//   unwind\n-//    implements:\n-//          - repeats\n-//          - volta\n-//          - d.c. al fine\n-//          - d.s. al fine\n-//          - d.s. al coda\n-//---------------------------------------------------------\n-\n-void RepeatList::unwind()\n-      {\n-      qDeleteAll(*this);\n-      clear();\n-      Measure* fm = _score->firstMeasure();\n-      if (!fm)\n-            return;\n-\n-// qDebug(\"unwind===================\");\n-      QList<Jump*> jumps; // take the jumps only once so store them\n-      rs                  = new RepeatSegment;\n-      rs->tick            = 0;\n-      Measure* endRepeat  = 0; // measure where the current repeat should stop\n-      Measure* continueAt = 0; // measure where the playback should continue after the repeat (To coda)\n-      int loop            = 0;\n-      int repeatCount     = 0;\n-      bool isGoto         = false;\n-\n-      for (Measure* m = fm; m; m = m->nextMeasure())\n-            m->setPlaybackCount(0);\n-\n-      for (Measure* m = fm; m;) {\n-            m->setPlaybackCount(m->playbackCount() + 1);\n-            Repeat flags = m->repeatFlags();\n-            bool doJump = false; // process jump after endrepeat\n-\n-// qDebug(\"repeat m%d(%d) lc%d loop %d repeatCount %d isGoto %d endRepeat %p flags 0x%x\",\n-//               m->no(), m->tick(), m->playbackCount(), loop, repeatCount, isGoto, endRepeat, int(flags));\n-\n-            if (endRepeat) {\n-                  Volta* volta = _score->searchVolta(m->tick());\n-                  if (volta && !volta->hasEnding(m->playbackCount())) {\n-                        // skip measure\n-                        if (rs->tick < m->tick()) {\n-                              rs->len = m->tick() - rs->tick;\n-                              append(rs);\n-                              rs = new RepeatSegment;\n-                              }\n-                        rs->tick = m->endTick();\n-                        }\n-                  else if (flags & Repeat::JUMP) {\n-                        doJump = true;\n-                        isGoto = false;\n-                        }\n-                  }\n-            else if (flags & Repeat::JUMP) { // Jumps are only accepted outside of other repeats\n-                  doJump = true;\n-                  }\n-                  \n-\n-            if (isGoto && (endRepeat == m)) {\n-                  if (continueAt == 0) {\n-// qDebug(\"  isGoto && endReapeat == %p, continueAt == 0\", m);\n-                        rs->len = m->endTick() - rs->tick;\n-                        if (rs->len)\n-                              append(rs);\n-                        else\n-                              delete rs;\n-                        update();\n-                        dump();\n-                        return;\n-                        }\n-                  rs->len = m->endTick() - rs->tick;\n-                  append(rs);\n-                  rs       = new RepeatSegment;\n-                  rs->tick = continueAt->tick();\n-                  m        = continueAt;\n-                  isGoto   = false;\n-                  endRepeat = 0;\n-                  continue;\n-                  }\n-            else if (flags & Repeat::END) {\n-                  if (endRepeat == m) {\n-                        ++loop;\n-                        if (loop >= repeatCount) {\n-                              endRepeat = 0;\n-                              loop = 0;\n-                              }\n-                        else {\n-                              m = jumpToStartRepeat(m);\n-                              continue;\n-                              }\n-                        }\n-                  else if (endRepeat == 0) {\n-                        if (m->playbackCount() >= m->repeatCount())\n-                             break;\n-                        endRepeat   = m;\n-                        repeatCount = m->repeatCount();\n-                        loop        = 1;\n-                        m = jumpToStartRepeat(m);\n-                        continue;\n-                        }\n-                  }\n-            if (doJump && !isGoto) {\n-                  Jump* s = 0;\n-                  foreach(Element* e, m->el()) {\n-                        if (e->type() == Element::Type::JUMP) {\n-                              s = static_cast<Jump*>(e);\n-                              break;\n-                              }\n-                        }\n-                  // jump only once\n-                  if (jumps.contains(s)) {\n-                        m = m->nextMeasure();\n-                        if (endRepeat == _score->searchLabel(s->playUntil()))\n-                              endRepeat = 0;\n-                        continue;\n-                        }\n-                  jumps.append(s);\n-                  if (s) {\n-                        Measure* nm = _score->searchLabel(s->jumpTo());\n-                        endRepeat   = _score->searchLabel(s->playUntil());\n-                        continueAt  = _score->searchLabel(s->continueAt());\n-\n-                        if (nm && endRepeat) {\n-                              isGoto      = true;\n-                              rs->len = m->endTick() - rs->tick;\n-                              append(rs);\n-                              rs = new RepeatSegment;\n-                              rs->tick  = nm->tick();\n-                              m = nm;\n-                              continue;\n-                              }\n-                        }\n-                  else\n-                        qDebug(\"Jump not found\");\n-                  }\n-            m = m->nextMeasure();\n-            }\n-\n-      if (rs) {\n-            Measure* lm = _score->lastMeasure();\n-            rs->len     = lm->endTick() - rs->tick;\n-            if (rs->len)\n-                  append(rs);\n-            else\n-                  delete rs;\n-            }\n-      update();\n-      dump();\n-      }\n-\n-//---------------------------------------------------------\n-//   jumpToStartRepeat\n-//---------------------------------------------------------\n-\n-Measure* RepeatList::jumpToStartRepeat(Measure* m)\n-      {\n-      Measure* nm;\n-      //\n-      // go back to start of repeat or section break\n-      // handle special case of end repeat (Measure m) has a section break\n-      //\n-      for (nm = m; nm && nm != _score->firstMeasure(); nm = nm->prevMeasure()) {\n-            if (nm->repeatFlags() & Repeat::START || (nm->sectionBreak() && m != nm)) {\n-                  if (nm->sectionBreak() && nm->nextMeasure())\n-                        nm = nm->nextMeasure();\n-                  break;\n-                  }\n-            }\n-      rs->len = m->tick() + m->ticks() - rs->tick;\n-      append(rs);\n-\n-      rs        = new RepeatSegment;\n-      rs->tick  = nm->tick();\n-      return nm;\n-      }\n-\n-}\n-\n+//=============================================================================\r","path":"libmscore/repeatlist.cpp","position":424,"original_position":424,"commit_id":"40e499e30fad8dc70f3b8db5f73a1f93b4440dee","original_commit_id":"40e499e30fad8dc70f3b8db5f73a1f93b4440dee","user":{"login":"ericfont","id":6502474,"avatar_url":"https://avatars.githubusercontent.com/u/6502474?v=3","gravatar_id":"","url":"https://api.github.com/users/ericfont","html_url":"https://github.com/ericfont","followers_url":"https://api.github.com/users/ericfont/followers","following_url":"https://api.github.com/users/ericfont/following{/other_user}","gists_url":"https://api.github.com/users/ericfont/gists{/gist_id}","starred_url":"https://api.github.com/users/ericfont/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ericfont/subscriptions","organizations_url":"https://api.github.com/users/ericfont/orgs","repos_url":"https://api.github.com/users/ericfont/repos","events_url":"https://api.github.com/users/ericfont/events{/privacy}","received_events_url":"https://api.github.com/users/ericfont/received_events","type":"User","site_admin":false},"body":"I'm confussed why this diff is doing the whole file...I only really changed unwind and unwindSection","created_at":"2015-08-14T17:02:03Z","updated_at":"2015-08-14T17:02:03Z","html_url":"https://github.com/musescore/MuseScore/pull/2165#discussion_r37096149","pull_request_url":"https://api.github.com/repos/musescore/MuseScore/pulls/2165","_links":{"self":{"href":"https://api.github.com/repos/musescore/MuseScore/pulls/comments/37096149"},"html":{"href":"https://github.com/musescore/MuseScore/pull/2165#discussion_r37096149"},"pull_request":{"href":"https://api.github.com/repos/musescore/MuseScore/pulls/2165"}}},"pull_request":{"url":"https://api.github.com/repos/musescore/MuseScore/pulls/2165","id":42380911,"html_url":"https://github.com/musescore/MuseScore/pull/2165","diff_url":"https://github.com/musescore/MuseScore/pull/2165.diff","patch_url":"https://github.com/musescore/MuseScore/pull/2165.patch","issue_url":"https://api.github.com/repos/musescore/MuseScore/issues/2165","number":2165,"state":"open","locked":false,"title":"Fix #65161 repeatlist unwind section by section","user":{"login":"ericfont","id":6502474,"avatar_url":"https://avatars.githubusercontent.com/u/6502474?v=3","gravatar_id":"","url":"https://api.github.com/users/ericfont","html_url":"https://github.com/ericfont","followers_url":"https://api.github.com/users/ericfont/followers","following_url":"https://api.github.com/users/ericfont/following{/other_user}","gists_url":"https://api.github.com/users/ericfont/gists{/gist_id}","starred_url":"https://api.github.com/users/ericfont/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ericfont/subscriptions","organizations_url":"https://api.github.com/users/ericfont/orgs","repos_url":"https://api.github.com/users/ericfont/repos","events_url":"https://api.github.com/users/ericfont/events{/privacy}","received_events_url":"https://api.github.com/users/ericfont/received_events","type":"User","site_admin":false},"body":"This pull requests generates the repeat list of a score with section breaks by individually generating the repeat lists of the individual sections and combining them in order.\r\n\r\nIt seems jojo, marc, and I agree on this expected behavior - that repeats should be handled independently for each section - but last lasconic comments on the forum seem to disagree with this interpretation.\r\n\r\n\"start\" and \"end\" tags are section aware, which is implemented by Score::searchLabelWithinSectionFirst.  As Jojo suggested, I haven't forbidden jumps to outside the current section, but I haven't tested it either (and I don't really know what exactly expected behavior should be for those).  So labels are first searched for in current section, and if not found there, then the old function Score::searchLabel will be used as a fallback, essentially allowing jumps to other sections.  \r\n\r\nMost of the functionality that was in RepeatList::unwind is moved to RepeatList::unwindSection, such that \"unwind\" only divides up the score into sections for unwindSection to handle.\r\n\r\nNote: No RepeatSection will ever go through a section break, in my implementation, but are essentially split into two RepeatSections at the section break.\r\n\r\nI added \"repeat27.mscx\" to mtest, is basically from Jojo's test example https://musescore.org/en/node/65161#comment-297721, but I modified movt 4 into a DS-al-Coda case since that case wasn't represented, and I removed superflous measurses.  That test passes, but I haven't extensively tested other scores, and I notice test 32 \"tools\" won't pass on my machine...I don't know what that is and haven't looked into that...I'm curious to see if it passes on travis.","created_at":"2015-08-13T18:11:54Z","updated_at":"2015-08-14T17:02:03Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5c5c05493fdd092f9a13df6f49a63c27f0f91d9c","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/musescore/MuseScore/pulls/2165/commits","review_comments_url":"https://api.github.com/repos/musescore/MuseScore/pulls/2165/comments","review_comment_url":"https://api.github.com/repos/musescore/MuseScore/pulls/comments{/number}","comments_url":"https://api.github.com/repos/musescore/MuseScore/issues/2165/comments","statuses_url":"https://api.github.com/repos/musescore/MuseScore/statuses/40e499e30fad8dc70f3b8db5f73a1f93b4440dee","head":{"label":"ericfont:65161-repeatlist-unwind-section-by-section","ref":"65161-repeatlist-unwind-section-by-section","sha":"40e499e30fad8dc70f3b8db5f73a1f93b4440dee","user":{"login":"ericfont","id":6502474,"avatar_url":"https://avatars.githubusercontent.com/u/6502474?v=3","gravatar_id":"","url":"https://api.github.com/users/ericfont","html_url":"https://github.com/ericfont","followers_url":"https://api.github.com/users/ericfont/followers","following_url":"https://api.github.com/users/ericfont/following{/other_user}","gists_url":"https://api.github.com/users/ericfont/gists{/gist_id}","starred_url":"https://api.github.com/users/ericfont/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ericfont/subscriptions","organizations_url":"https://api.github.com/users/ericfont/orgs","repos_url":"https://api.github.com/users/ericfont/repos","events_url":"https://api.github.com/users/ericfont/events{/privacy}","received_events_url":"https://api.github.com/users/ericfont/received_events","type":"User","site_admin":false},"repo":{"id":38296423,"name":"MuseScore","full_name":"ericfont/MuseScore","owner":{"login":"ericfont","id":6502474,"avatar_url":"https://avatars.githubusercontent.com/u/6502474?v=3","gravatar_id":"","url":"https://api.github.com/users/ericfont","html_url":"https://github.com/ericfont","followers_url":"https://api.github.com/users/ericfont/followers","following_url":"https://api.github.com/users/ericfont/following{/other_user}","gists_url":"https://api.github.com/users/ericfont/gists{/gist_id}","starred_url":"https://api.github.com/users/ericfont/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ericfont/subscriptions","organizations_url":"https://api.github.com/users/ericfont/orgs","repos_url":"https://api.github.com/users/ericfont/repos","events_url":"https://api.github.com/users/ericfont/events{/privacy}","received_events_url":"https://api.github.com/users/ericfont/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ericfont/MuseScore","description":"MuseScore is an open source and free music notation software. For support, contribution, bug reports, visit MuseScore.org. Fork and make pull requests!","fork":true,"url":"https://api.github.com/repos/ericfont/MuseScore","forks_url":"https://api.github.com/repos/ericfont/MuseScore/forks","keys_url":"https://api.github.com/repos/ericfont/MuseScore/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ericfont/MuseScore/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ericfont/MuseScore/teams","hooks_url":"https://api.github.com/repos/ericfont/MuseScore/hooks","issue_events_url":"https://api.github.com/repos/ericfont/MuseScore/issues/events{/number}","events_url":"https://api.github.com/repos/ericfont/MuseScore/events","assignees_url":"https://api.github.com/repos/ericfont/MuseScore/assignees{/user}","branches_url":"https://api.github.com/repos/ericfont/MuseScore/branches{/branch}","tags_url":"https://api.github.com/repos/ericfont/MuseScore/tags","blobs_url":"https://api.github.com/repos/ericfont/MuseScore/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ericfont/MuseScore/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ericfont/MuseScore/git/refs{/sha}","trees_url":"https://api.github.com/repos/ericfont/MuseScore/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ericfont/MuseScore/statuses/{sha}","languages_url":"https://api.github.com/repos/ericfont/MuseScore/languages","stargazers_url":"https://api.github.com/repos/ericfont/MuseScore/stargazers","contributors_url":"https://api.github.com/repos/ericfont/MuseScore/contributors","subscribers_url":"https://api.github.com/repos/ericfont/MuseScore/subscribers","subscription_url":"https://api.github.com/repos/ericfont/MuseScore/subscription","commits_url":"https://api.github.com/repos/ericfont/MuseScore/commits{/sha}","git_commits_url":"https://api.github.com/repos/ericfont/MuseScore/git/commits{/sha}","comments_url":"https://api.github.com/repos/ericfont/MuseScore/comments{/number}","issue_comment_url":"https://api.github.com/repos/ericfont/MuseScore/issues/comments{/number}","contents_url":"https://api.github.com/repos/ericfont/MuseScore/contents/{+path}","compare_url":"https://api.github.com/repos/ericfont/MuseScore/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ericfont/MuseScore/merges","archive_url":"https://api.github.com/repos/ericfont/MuseScore/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ericfont/MuseScore/downloads","issues_url":"https://api.github.com/repos/ericfont/MuseScore/issues{/number}","pulls_url":"https://api.github.com/repos/ericfont/MuseScore/pulls{/number}","milestones_url":"https://api.github.com/repos/ericfont/MuseScore/milestones{/number}","notifications_url":"https://api.github.com/repos/ericfont/MuseScore/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ericfont/MuseScore/labels{/name}","releases_url":"https://api.github.com/repos/ericfont/MuseScore/releases{/id}","created_at":"2015-06-30T08:12:13Z","updated_at":"2015-06-30T08:12:34Z","pushed_at":"2015-08-14T16:40:50Z","git_url":"git://github.com/ericfont/MuseScore.git","ssh_url":"git@github.com:ericfont/MuseScore.git","clone_url":"https://github.com/ericfont/MuseScore.git","svn_url":"https://github.com/ericfont/MuseScore","homepage":"http://musescore.org","size":202382,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"musescore:master","ref":"master","sha":"52adf6107e117247e5464c23af8068cd6add1a1f","user":{"login":"musescore","id":380563,"avatar_url":"https://avatars.githubusercontent.com/u/380563?v=3","gravatar_id":"","url":"https://api.github.com/users/musescore","html_url":"https://github.com/musescore","followers_url":"https://api.github.com/users/musescore/followers","following_url":"https://api.github.com/users/musescore/following{/other_user}","gists_url":"https://api.github.com/users/musescore/gists{/gist_id}","starred_url":"https://api.github.com/users/musescore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/musescore/subscriptions","organizations_url":"https://api.github.com/users/musescore/orgs","repos_url":"https://api.github.com/users/musescore/repos","events_url":"https://api.github.com/users/musescore/events{/privacy}","received_events_url":"https://api.github.com/users/musescore/received_events","type":"Organization","site_admin":false},"repo":{"id":4454793,"name":"MuseScore","full_name":"musescore/MuseScore","owner":{"login":"musescore","id":380563,"avatar_url":"https://avatars.githubusercontent.com/u/380563?v=3","gravatar_id":"","url":"https://api.github.com/users/musescore","html_url":"https://github.com/musescore","followers_url":"https://api.github.com/users/musescore/followers","following_url":"https://api.github.com/users/musescore/following{/other_user}","gists_url":"https://api.github.com/users/musescore/gists{/gist_id}","starred_url":"https://api.github.com/users/musescore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/musescore/subscriptions","organizations_url":"https://api.github.com/users/musescore/orgs","repos_url":"https://api.github.com/users/musescore/repos","events_url":"https://api.github.com/users/musescore/events{/privacy}","received_events_url":"https://api.github.com/users/musescore/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/musescore/MuseScore","description":"MuseScore is an open source and free music notation software. For support, contribution, bug reports, visit MuseScore.org. Fork and make pull requests!","fork":false,"url":"https://api.github.com/repos/musescore/MuseScore","forks_url":"https://api.github.com/repos/musescore/MuseScore/forks","keys_url":"https://api.github.com/repos/musescore/MuseScore/keys{/key_id}","collaborators_url":"https://api.github.com/repos/musescore/MuseScore/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/musescore/MuseScore/teams","hooks_url":"https://api.github.com/repos/musescore/MuseScore/hooks","issue_events_url":"https://api.github.com/repos/musescore/MuseScore/issues/events{/number}","events_url":"https://api.github.com/repos/musescore/MuseScore/events","assignees_url":"https://api.github.com/repos/musescore/MuseScore/assignees{/user}","branches_url":"https://api.github.com/repos/musescore/MuseScore/branches{/branch}","tags_url":"https://api.github.com/repos/musescore/MuseScore/tags","blobs_url":"https://api.github.com/repos/musescore/MuseScore/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/musescore/MuseScore/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/musescore/MuseScore/git/refs{/sha}","trees_url":"https://api.github.com/repos/musescore/MuseScore/git/trees{/sha}","statuses_url":"https://api.github.com/repos/musescore/MuseScore/statuses/{sha}","languages_url":"https://api.github.com/repos/musescore/MuseScore/languages","stargazers_url":"https://api.github.com/repos/musescore/MuseScore/stargazers","contributors_url":"https://api.github.com/repos/musescore/MuseScore/contributors","subscribers_url":"https://api.github.com/repos/musescore/MuseScore/subscribers","subscription_url":"https://api.github.com/repos/musescore/MuseScore/subscription","commits_url":"https://api.github.com/repos/musescore/MuseScore/commits{/sha}","git_commits_url":"https://api.github.com/repos/musescore/MuseScore/git/commits{/sha}","comments_url":"https://api.github.com/repos/musescore/MuseScore/comments{/number}","issue_comment_url":"https://api.github.com/repos/musescore/MuseScore/issues/comments{/number}","contents_url":"https://api.github.com/repos/musescore/MuseScore/contents/{+path}","compare_url":"https://api.github.com/repos/musescore/MuseScore/compare/{base}...{head}","merges_url":"https://api.github.com/repos/musescore/MuseScore/merges","archive_url":"https://api.github.com/repos/musescore/MuseScore/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/musescore/MuseScore/downloads","issues_url":"https://api.github.com/repos/musescore/MuseScore/issues{/number}","pulls_url":"https://api.github.com/repos/musescore/MuseScore/pulls{/number}","milestones_url":"https://api.github.com/repos/musescore/MuseScore/milestones{/number}","notifications_url":"https://api.github.com/repos/musescore/MuseScore/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/musescore/MuseScore/labels{/name}","releases_url":"https://api.github.com/repos/musescore/MuseScore/releases{/id}","created_at":"2012-05-26T12:46:33Z","updated_at":"2015-08-13T10:49:22Z","pushed_at":"2015-08-14T16:40:51Z","git_url":"git://github.com/musescore/MuseScore.git","ssh_url":"git@github.com:musescore/MuseScore.git","clone_url":"https://github.com/musescore/MuseScore.git","svn_url":"https://github.com/musescore/MuseScore","homepage":"http://musescore.org","size":382324,"stargazers_count":733,"watchers_count":733,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":441,"mirror_url":null,"open_issues_count":50,"forks":441,"open_issues":50,"watchers":733,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/musescore/MuseScore/pulls/2165"},"html":{"href":"https://github.com/musescore/MuseScore/pull/2165"},"issue":{"href":"https://api.github.com/repos/musescore/MuseScore/issues/2165"},"comments":{"href":"https://api.github.com/repos/musescore/MuseScore/issues/2165/comments"},"review_comments":{"href":"https://api.github.com/repos/musescore/MuseScore/pulls/2165/comments"},"review_comment":{"href":"https://api.github.com/repos/musescore/MuseScore/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/musescore/MuseScore/pulls/2165/commits"},"statuses":{"href":"https://api.github.com/repos/musescore/MuseScore/statuses/40e499e30fad8dc70f3b8db5f73a1f93b4440dee"}}}}