docs: function saveRoot(msg, callback) {
              var persisted,
                  numberOfPersistedObjects,
                  wrappedCallback,
                  callbacks;
  
              logger.debug('saveRoot msg', msg);
  
              if (!state.viewer && !state.readOnlyProject && state.nodes[ROOT_PATH]) {
                  if (state.msg && msg) {
                      state.msg += '\n' + msg;
                  } else {
                      state.msg = msg;
                  }
  
                  if (state.transactions.opened === 0) {
                      ASSERT(state.project && state.core && state.branchName);
  
                      callbacks = state.transactions.callbacks;
                      state.transactions.callbacks = [];
  
                      wrappedCallback = function (err, result) {
                          if (err) {
                              logger.error('saveRoot failure', err);
                          } else {
                              logger.debug('saveRoot', result);
                          }
  
                          callbacks.forEach(function (cb) {
                              cb(err, result);
                          });
                      };
  
                      logger.debug('is NOT in transaction - will persist.');
                      // console.time('persist');
                      persisted = state.core.persist(state.nodes[ROOT_PATH].node);
                      // console.timeEnd('persist');
                      logger.debug('persisted', persisted);
                      numberOfPersistedObjects = Object.keys(persisted.objects).length;
                      if (numberOfPersistedObjects === 0) {
                          logger.warn('No changes after persist will return from saveRoot.');
                          wrappedCallback(null);
                          return;
                      } else if (numberOfPersistedObjects > 200) {
                          //This is just for debugging
                          logger.warn('Lots of persisted objects', numberOfPersistedObjects);
                      }
  
                      // Make the commit on the storage (will emit hashUpdated)
                      storage.makeCommit(
                          state.project.projectId,
                          state.branchName,
                          [state.commitHash],
                          persisted.rootHash,
                          persisted.objects,
                          state.msg,
                          wrappedCallback
                      );
  
                      state.msg = '';
                  } else {
                      logger.debug('is in transaction - will NOT persist.');
  
                  }
              } else {
                  //TODO: Why is this set to empty here?
                  state.msg = '';
                  callback && callback(null);
              }
          }