diff --git a/ChangeLog b/ChangeLog index 6025b1c5..7d23be7a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -34,6 +34,9 @@ would be on top. * Added ability to copy files. +* Fixed bug with saving json to localStorage, it's always +writed root directory. + 2012.03.01, Version 0.1.9 diff --git a/lib/client.js b/lib/client.js index f79e4f29..c7780a8a 100644 --- a/lib/client.js +++ b/lib/client.js @@ -335,8 +335,9 @@ var Util, DOM, CloudFunc, $, KeyBinding, CloudCommander; /* устанавливаем переменную доступности кэша */ DOM.Cache.isAllowed(); /* Устанавливаем кэш корневого каталога */ - if( !DOM.Cache.get('/') ) - DOM.Cache.set('/', CloudCmd._getJSONfromFileTable()); + var lDirPath = DOM.getCurrentDirPath(); + if( !DOM.Cache.get(lDirPath) ) + DOM.Cache.set(lDirPath, CloudCmd._getJSONfromFileTable()); }); /* выделяем строку с первым файлом */ @@ -544,18 +545,22 @@ var Util, DOM, CloudFunc, $, KeyBinding, CloudCommander; pOptions = {}; /* Отображаем красивые пути */ - var lFSPath = decodeURI(pPath), + var lSLASH = '/', + lFSPath = decodeURI(pPath), lNOJSPath = Util.removeStr( lFSPath, '?json' ), - lCleanPath = Util.removeStr( lNOJSPath, CloudFunc.FS ) || '/', + lCleanPath = Util.removeStr( lNOJSPath, CloudFunc.FS ) || lSLASH, lOldURL = window.location.pathname; + if(lCleanPath === lSLASH) + lNOJSPath = lSLASH; + else + lCleanPath += lSLASH; + Util.log ('reading dir: "' + lCleanPath + '";'); - if(!pOptions.nohistory){ - lNOJSPath = lCleanPath === '/' ? '/' : lNOJSPath; + if(!pOptions.nohistory) DOM.setHistory(lNOJSPath, null, lNOJSPath); - } DOM.setTitle( CloudFunc.getTitle(lCleanPath) ); @@ -679,18 +684,20 @@ var Util, DOM, CloudFunc, $, KeyBinding, CloudCommander; /* пропускам Path и Header*/ for(i = 2, n = lLI.length; i < n; i++){ var lCurrent = lLI[i], - + lName = DOM.getCurrentName(lCurrent), + lSize = DOM.getCurrentSize(lCurrent), /* переводим права доступа в цыфровой вид * для хранения в localStorage */ lMode = DOM.getCurrentMode(lCurrent); - lMode = CloudFunc.convertPermissionsToNumberic(lMode); + lMode = CloudFunc.getNumericPermissions(lMode); - lFileTable[ j++ ] = { - name: DOM.getCurrentName(lCurrent), - size: DOM.getCurrentSize(lCurrent), - mode: lMode - }; + if(lName !== '..') + lFileTable[ j++ ] = { + name: lName, + size: lSize, + mode: lMode + }; } return Util.stringifyJSON(lFileTable); }; diff --git a/lib/cloudfunc.js b/lib/cloudfunc.js index 63afa94e..2eb11f28 100644 --- a/lib/cloudfunc.js +++ b/lib/cloudfunc.js @@ -1,4 +1,4 @@ -var CloudFunc, exports; +var CloudFunc, exports, Util; (function(){ 'use strict'; @@ -7,36 +7,56 @@ var CloudFunc, exports; * Модуль, содержащий функции, которые * будут работать и на клиенте и на сервере */ - - CloudFunc = exports || {}; + var FS; + if(exports){ + CloudFunc = exports; + if(!global.cloudcmd){ + return console.log( + '# cloudfunc.js' + '\n' + + '# -----------' + '\n' + + '# Module is part of Cloud Commander,' + '\n' + + '# used for work generate html from json.' + '\n' + + '# ' + '\n' + + '# http://coderaiser.github.com/cloudcmd' + '\n'); + } + + Util = global.cloudcmd.main.util; + } + else + CloudFunc = {}; /* Путь с которым мы сейчас работаем */ - CloudFunc.Path = ''; + CloudFunc.Path = ''; /* КОНСТАНТЫ (общие для клиента и сервера)*/ /* название программы */ - CloudFunc.NAME = 'Cloud Commander'; + CloudFunc.NAME = 'Cloud Commander'; /* если в ссылке будет эта строка - в браузере js отключен */ - CloudFunc.FS = '/fs'; + CloudFunc.FS = FS = '/fs'; /* название css-класа кнопки обновления файловой структуры*/ - CloudFunc.REFRESHICON = 'refresh-icon'; + CloudFunc.REFRESHICON = 'refresh-icon'; /* id панелей с файлами */ - CloudFunc.LEFTPANEL = 'left'; - CloudFunc.RIGHTPANEL = 'right'; + CloudFunc.LEFTPANEL = 'left'; + CloudFunc.RIGHTPANEL = 'right'; /** * Функция убирает последний слеш, * если он - последний символ строки */ CloudFunc.removeLastSlash = function(pPath){ - if(typeof pPath==='string') - return (pPath.lastIndexOf('/') === pPath.length-1) ? - pPath.substr(pPath, pPath.length-1):pPath; - else return pPath; + var lRet = pPath, + lIsStr = typeof pPath==='string', + lLengh = pPath.length-1, + lLastSlash = pPath.lastIndexOf('/'); + + if(lIsStr && lLastSlash === lLengh) + lRet = pPath.substr(pPath, lLengh); + + return lRet; }; /** Функция возвращает заголовок веб страницы @@ -54,7 +74,7 @@ var CloudFunc, exports; * @param pPerm_s - строка с правами доступа * к файлу в 8-миричной системе */ - CloudFunc.convertPermissionsToSymbolic = function(pPerm_s){ + CloudFunc.getSymbolicPermissions = function(pPerm_s){ /* S_IRUSR 0000400 protection: readable by owner S_IWUSR 0000200 writable by owner @@ -102,28 +122,24 @@ var CloudFunc, exports; of using an application-specific shorthand). */ /* Переводим в двоичную систему */ - var lOwner = (pPerm_s[0]-0).toString(2), - lGroup = (pPerm_s[1]-0).toString(2), - lAll = (pPerm_s[2]-0).toString(2), - /* - console.log(lOwner+' '+lGroup+' '+lAll); - */ + var lOwner = ( pPerm_s[0] - 0 ).toString(2), + lGroup = ( pPerm_s[1] - 0 ).toString(2), + lAll = ( pPerm_s[2] - 0 ).toString(2), + /* переводим в символьную систему*/ - lPermissions = //lType+' '+ - (lOwner[0]-0>0?'r':'-') + - (lOwner[1]-0>0?'w':'-') + - (lOwner[2]-0>0?'x':'-') + - ' ' + - (lGroup[0]-0>0?'r':'-') + - (lGroup[1]-0>0?'w':'-') + - (lGroup[2]-0>0?'x':'-') + - ' ' + - (lAll[0]-0>0?'r':'-') + - (lAll[1]-0>0?'w':'-') + - (lAll[2]-0>0?'x':'-'); - /* - console.log(lPermissions); - */ + lPermissions = + ( lOwner[0] - 0 > 0 ? 'r' : '-' ) + + ( lOwner[1] - 0 > 0 ? 'w' : '-' ) + + ( lOwner[2] - 0 > 0 ? 'x' : '-' ) + + ' ' + + ( lGroup[0] - 0 > 0 ? 'r' : '-' ) + + ( lGroup[1] - 0 > 0 ? 'w' : '-' ) + + ( lGroup[2] - 0 > 0 ? 'x' : '-' ) + + ' ' + + ( lAll[0]- 0 > 0 ? 'r' : '-' ) + + ( lAll[1]- 0 > 0 ? 'w' : '-' ) + + ( lAll[2]- 0 > 0 ? 'x' : '-' ); + return lPermissions; }; @@ -131,10 +147,7 @@ var CloudFunc, exports; * Функция конвертирует права доступа к файлам из символьного вида * в цыфровой */ - CloudFunc.convertPermissionsToNumberic = function(pPerm_s){ - /* если передана правильная строка, конвертированная - * функциец convertPermissionsToSymbolic - */ + CloudFunc.getNumericPermissions = function(pPerm_s){ if(!pPerm_s || pPerm_s.length!==11)return pPerm_s; var lOwner= (pPerm_s[0] === 'r' ? 4 : 0) + @@ -193,11 +206,11 @@ var CloudFunc, exports; if(lLine){ /* удаляем первую строку из /etc/passwd*/ - pPasswd_s = pPasswd_s.replace(lLine, ''); + pPasswd_s = Util.removeStr(pPasswd_s, lLine); /* получаем первое слово строки */ var lName = lLine.substr(lLine,lLine.indexOf(':')); - lLine = lLine.replace(lName+':x:',''); + lLine = Util.removeStr(lLine, lName + ':x:'); /* получаем uid*/ var lUID = lLine.substr(lLine,lLine.indexOf(':')); @@ -218,7 +231,8 @@ var CloudFunc, exports; * @param url - адрес каталога */ CloudFunc._getDirPath = function(url){ - var folders = [], + var lShortName, + folders = [], i = 0; do{ folders[i++] = url; @@ -231,30 +245,25 @@ var CloudFunc, exports; _l = '">', lHrefEnd ='', - lHtmlPath, - - lFS_s = CloudFunc.FS; - /* корневой каталог */ - lHtmlPath = lHref + - lFS_s + - lTitle + - '/' + - _l + - '/' + - lHrefEnd; + /* корневой каталог */ + lHtmlPath = lHref + FS + lTitle + + '/' + _l + '/' + + lHrefEnd; - for(i = folders.length - 1; i > 0; i--) - { - var lUrl=folders[i], - lShortName = lUrl.replace(lUrl.substr(lUrl,lUrl.lastIndexOf('/')+1),''); - if (i!==1) - lHtmlPath += lHref + lFS_s + lUrl + - lTitle + lUrl + _l + - lShortName + lHrefEnd + '/'; + for(i = folders.length - 1; i > 0; i--){ + var lUrl = folders[i], + lSlashIndex = lUrl.lastIndexOf('/') + 1; + + lShortName = Util.removeStr(lUrl, lUrl.substr(lUrl, lSlashIndex) ); + + if(i !== 1) + lHtmlPath += lHref + FS + lUrl + + lTitle + lUrl + _l + + lShortName + lHrefEnd + '/'; else - lHtmlPath+=lShortName+'/'; + lHtmlPath += lShortName + '/'; } - /* *** */ + return lHtmlPath; }; @@ -353,11 +362,13 @@ var CloudFunc, exports; } for(var i = 1, n = files.length; i < n; i++){ + var lFile = files[i]; + lFileTable += '
  • '; lFileTable += ''; lFileTable += ''; @@ -366,37 +377,30 @@ var CloudFunc, exports; '"' + /* открываем файлы */ /*в новой вкладке */ - (files[i].size === 'dir' ? + (lFile.size === 'dir' ? '' : ' target="_blank"') + - ' title="' + files[i].name +'"' + - ' draggable=true>' + files[i].name + + ' title="' + lFile.name +'"' + + ' draggable=true>' + lFile.name + "" + ''; /* если папка - не выводим размер */ lFileTable += '' + - (files[i].size === 'dir' ? + (lFile.size === 'dir' ? '<dir>' /* если это файл - получаем * короткий размер */ : CloudFunc.getShortSize( - files[i].size)); + lFile.size)); lFileTable += '' + '' + - (!files[i].uid ? 'root' : files[i].uid) + + (!lFile.uid ? 'root' : lFile.uid) + '' + '' + /* конвертируем названия разрешений - * из числового формата в буквенный - * при этом корневой каталог не трогаем - * по скольку в нём и так всё уже - * установлено еще на сервере - */ - (//lPath==='/'?files[i].mode: - CloudFunc - .convertPermissionsToSymbolic - (files[i].mode)) + + * из числового формата в буквенный */ + CloudFunc.getSymbolicPermissions(lFile.mode)+ ''; lFileTable += '
  • '; } diff --git a/shell/deploy.sh b/shell/deploy.sh index 316dbf69..9e4711e0 100755 --- a/shell/deploy.sh +++ b/shell/deploy.sh @@ -1,10 +1,15 @@ cd .. +echo 'jitsu' +cp package.json tmp/package.json +jitsu deploy +echo '://cloudcmd.jit.su' +cp tmp/package.json package.json echo 'appfog' af update -echo 'http://cloudcmd.aws.af.cm/' +echo '://cloudcmd.aws.af.cm' echo 'cloud foundry' vmc update -echo 'http://cloudcmd.cloudfoundry.com/' +echo '://cloudcmd.cloudfoundry.com' echo 'nodester' git push nodester master echo 'heroku'