mirror of
https://github.com/chylex/Nextcloud-Desktop.git
synced 2026-04-05 14:34:16 +02:00
Compare commits
40 Commits
v1.3.0-bet
...
v1.3.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7cd2f39f82 | ||
|
|
949dd5db35 | ||
|
|
49a5c5bb8b | ||
|
|
48aa355eea | ||
|
|
644b2673e0 | ||
|
|
8eed62e639 | ||
|
|
04c8449e5f | ||
|
|
016868e95a | ||
|
|
a662c85728 | ||
|
|
12cc8bfd95 | ||
|
|
11c6f20c90 | ||
|
|
c602ec310d | ||
|
|
b206a3b8e2 | ||
|
|
3bff5a061b | ||
|
|
0bc9b6f44e | ||
|
|
905f70a186 | ||
|
|
a8707b681d | ||
|
|
5d8f9f5346 | ||
|
|
a441b1d562 | ||
|
|
6e2042cd55 | ||
|
|
bb8b58dc66 | ||
|
|
9cd099056b | ||
|
|
0adbc032ae | ||
|
|
22a679fb8c | ||
|
|
35a67fab0a | ||
|
|
fdc8117211 | ||
|
|
24208e6137 | ||
|
|
46c7026726 | ||
|
|
01ad3c4d81 | ||
|
|
4ac98bde73 | ||
|
|
f42a6d6ef6 | ||
|
|
9055c6ade7 | ||
|
|
1356a5bbaa | ||
|
|
3c320c2736 | ||
|
|
969757199e | ||
|
|
60f1c65a48 | ||
|
|
b87b0e16e6 | ||
|
|
8ed0b1be55 | ||
|
|
91b5f1076f | ||
|
|
8ec2457965 |
27
ChangeLog
27
ChangeLog
@@ -1,5 +1,32 @@
|
||||
ChangeLog
|
||||
=========
|
||||
version 1.3.0 (release 2013-06-25 ), csync 0.80.0 required
|
||||
|
||||
* Default proxy port to 8080
|
||||
* Don't lose proxy settings when changing passwords
|
||||
* Support SOCKS5 proxy (useful in combination with ssh *D)
|
||||
* Propagate proxy changes to csync at runtime
|
||||
* Improve proxy wizard
|
||||
* Display proxy errors
|
||||
* Solved problems with lock files
|
||||
* Warn if for some reason all files are scheduled for removal on either side
|
||||
* Avoid infinite loop if authentication fails in certain cases
|
||||
* Fix reading the password from the config in certain cases
|
||||
* Do not crash when configured sync target disappears
|
||||
* Make --help work on windows
|
||||
* Make sync feedback less ambiguous.
|
||||
* Fix icon tray tooltip sometimes showing repeated content
|
||||
* More use of native directory separators on Windows
|
||||
* Remove journal when reusing a directory that used to have a journal before
|
||||
* Visual clean up of status dialog items
|
||||
* Wizard: When changing the URL or user name, allow the user to push his data
|
||||
to the new location or wipe the folder and start from scratch
|
||||
* Wizard: Make setting a custom folder as a sync target work again
|
||||
* Fix application icon
|
||||
* User-Agent now contains "Mozilla/5.0" and the Platform name (for firewall/proxy compat)
|
||||
* Server side directory moves will be detected
|
||||
* New setup wizard, defaulting to root syncing (only for new setups)
|
||||
* Improved thread stop/termination
|
||||
|
||||
version 1.2.5 (release 2013-04-23 ), csync 0.70.7 required
|
||||
* [Fixes] NSIS installer fixes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
set( VERSION_MAJOR 1 )
|
||||
set( VERSION_MINOR 3 )
|
||||
set( VERSION_PATCH 0 )
|
||||
set( VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SUFFIX}beta3)
|
||||
set( VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SUFFIX})
|
||||
set( SOVERSION 0 )
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = u'ownCloud Client Manual'
|
||||
copyright = u'2012, The ownCloud developers'
|
||||
copyright = u'2013, The ownCloud developers'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
@@ -215,8 +215,6 @@ latex_documents = [
|
||||
man_pages = [
|
||||
('owncloud.1', 'owncloud', u'File synchronisation desktop utility.',
|
||||
[u'The ownCloud developers'], 1),
|
||||
('mirall.1', 'mirall', u'File synchronisation desktop utility.',
|
||||
[u'The ownCloud developers'], 1)
|
||||
]
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
@@ -250,7 +248,7 @@ texinfo_documents = [
|
||||
epub_title = u'ownCloud Client Manual'
|
||||
epub_author = u'The ownCloud developers'
|
||||
epub_publisher = u'The ownCloud developers'
|
||||
epub_copyright = u'2012, The ownCloud developers'
|
||||
epub_copyright = u'2013, The ownCloud developers'
|
||||
|
||||
# The language of the text. It defaults to the language option
|
||||
# or en if the language is not set.
|
||||
|
||||
@@ -16,8 +16,6 @@ It contains settings in the ini file format known from Windows.
|
||||
|
||||
.. note:: Changes may be overwritten by using ownCloud's configuration dialog.
|
||||
|
||||
.. note:: The new version is less precise in this regard.
|
||||
|
||||
These are config settings that may be changed:
|
||||
|
||||
``remotePollinterval`` (default: ``30000``)
|
||||
@@ -26,6 +24,3 @@ These are config settings that may be changed:
|
||||
``maxLogLines`` (default: ``20000``)
|
||||
Maximum count of log lines shown in the log window
|
||||
|
||||
``remotePollinterval``
|
||||
The frequency used for polling for remote changes on the ownCloud Server.
|
||||
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
mirall(1)
|
||||
---------
|
||||
|
||||
SYNOPSIS
|
||||
========
|
||||
|
||||
*mirall* [`OPTIONS`...]
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
===========
|
||||
|
||||
mirall is a file synchronisation desktop utility.
|
||||
It synchronizes files on your local machine with an ownCloud Server. If you
|
||||
make a change to the files on one computer, it will flow across the others
|
||||
using this desktop sync clients.
|
||||
|
||||
Normally you start the client by click on the desktop icon or start from the
|
||||
application menu. After starting an ownCloud icon appears in the system tray.
|
||||
|
||||
Options
|
||||
=======
|
||||
.. include:: options.rst
|
||||
|
||||
Config File
|
||||
===========
|
||||
.. include:: conffile.rst
|
||||
|
||||
BUGS
|
||||
====
|
||||
|
||||
Please report bugs at https://github.com/owncloud/core/issues.
|
||||
|
||||
|
||||
SEE ALSO
|
||||
========
|
||||
`csync(1)`, `mirall(1)`
|
||||
|
||||
@@ -3,6 +3,9 @@ ownCloud Client supports the following command line switches:
|
||||
``--logwindow``
|
||||
open a window to show log output at startup.
|
||||
|
||||
``--logfile`` `<file>`
|
||||
write log output to a single file
|
||||
|
||||
``--logdir`` `<dir>`
|
||||
write log output to dir, one for each sync run.
|
||||
|
||||
@@ -12,4 +15,3 @@ ownCloud Client supports the following command line switches:
|
||||
``--monoicons``
|
||||
Use black/white pictograms for systray.
|
||||
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ SYNOPSIS
|
||||
|
||||
DESCRIPTION
|
||||
===========
|
||||
ownCloud is a file synchronisation desktop utility it is based on mirall.
|
||||
ownCloud is a file synchronisation desktop utility based on mirall.
|
||||
It synchronizes files on your local machine with an ownCloud Server. If you
|
||||
make a change to the files on one computer, it will flow across the others
|
||||
using this desktop sync clients.
|
||||
@@ -33,5 +33,5 @@ Please report bugs at https://github.com/owncloud/core/issues.
|
||||
|
||||
SEE ALSO
|
||||
========
|
||||
`csync(1)`, `mirall(1)`
|
||||
`csync(1)`
|
||||
|
||||
|
||||
@@ -6,9 +6,10 @@ basic reasons: Either the server setup has a problem or the client
|
||||
has a bug. When reporting bugs, it is crucial to find out what part
|
||||
of the system causes the problem.
|
||||
|
||||
Here are a couple of useful steps to isolate the problem.
|
||||
Identifying basic functionality problems
|
||||
----------------------------------------
|
||||
|
||||
:A general ownCloud Server test:
|
||||
:Perform a general ownCloud Server test:
|
||||
A very first check is to verify that you can log on to ownClouds web
|
||||
application. Assuming your ownCloud instance is installed at
|
||||
``http://yourserver.com/owncloud``, type
|
||||
@@ -18,8 +19,12 @@ Here are a couple of useful steps to isolate the problem.
|
||||
see a red warning box on the page, your server setup is not correct or needs
|
||||
fixes. Please verify that your server installation is working correctly.
|
||||
|
||||
:All desktop clients fail to connect to ownCloud:
|
||||
The ownCloud syncing use the built in WebDAV server of ownCloud.
|
||||
:Ensure the WebDAV API is working:
|
||||
If all desktop clients fail to connect to ownCloud, but the access via the
|
||||
web interface works, the problem often is a mis-configuration of the WebDAV
|
||||
API.
|
||||
|
||||
The ownCloud client uses the built-in WebDAV access of the server content.
|
||||
Verify that you can log on to ownClouds WebDAV server. Assuming your ownCloud
|
||||
instance is installed at ``http://yourserver.com/owncloud``, type
|
||||
``http://yourserver.com/owncloud/remote.php/webdav`` into your browsers
|
||||
@@ -31,13 +36,34 @@ Here are a couple of useful steps to isolate the problem.
|
||||
|
||||
:Use a WebDAV command line tool to test:
|
||||
A more sophisticated test is to use a WebDAV command line client and log
|
||||
into the ownCloud WebDAV server, such as a little app called cadaver, available
|
||||
on Linux. It can be used to further verify that the WebDAV server is running
|
||||
properly, for example by performing PROPFIND calls:
|
||||
into the ownCloud WebDAV server, such as a little app called cadaver,
|
||||
available on Linux. It can be used to further verify that the WebDAV server is
|
||||
running properly, for example by performing PROPFIND calls:
|
||||
|
||||
``propget .`` called within cadaver will return some properties of the current
|
||||
directory and thus be a successful WebDAV connect.
|
||||
|
||||
Isolating other issues
|
||||
----------------------
|
||||
|
||||
If the sync result is unreliable, please ensure that the folder synced with
|
||||
ownCloud is not shared with other syncing apps.
|
||||
|
||||
.. note:: Syncing the same directory with ownCloud and other sync software such
|
||||
as Unison, rsync, Microsoft Windows Offline Folders or cloud services
|
||||
such as DropBox or Microsoft SkyDrive is not supported and should
|
||||
not be attempted. In the worst case, doing so can result in data
|
||||
loss.
|
||||
|
||||
If you are operating your own server and use the local storage backend (the
|
||||
default), make sure that ownCloud has exclusive access to the directory.
|
||||
|
||||
.. note:: The data directory on the server is exclusive to ownCloud and must
|
||||
not be modified manually.
|
||||
|
||||
If you are using a different backend, you can try to exclude a bug in the
|
||||
backend by reverting to the local backend.
|
||||
|
||||
Logfiles
|
||||
========
|
||||
|
||||
@@ -61,20 +87,23 @@ It is also possible to directly log to a directory, which is an useful option
|
||||
in case the problem only happens ocassionally. In that case it is better to
|
||||
create a huge amount of data, as the log window has a limited buffer.
|
||||
|
||||
To write logs to disk, start the client with ``--logdir <dir>``, where ``<dir>``
|
||||
is an existing directory. Each sync run will create a new file.
|
||||
To write logs to disk, start the client with ``--logfile <file>``, where
|
||||
``<file`` is the file you want to log to, or ``--logdir <dir>``, where ``<dir>``
|
||||
is an existing directory. In case of ``--logdir``, each sync run will create a
|
||||
new file.
|
||||
|
||||
:ownCloud server Logfile:
|
||||
The ownCloud server maintains an ownCloud specific logfile as well. It can and
|
||||
must be enabled through the ownCloud Administration page. There you can adjust
|
||||
the loglevel. It is advisable to set it to a verbose level like ``Debug`` or ``Info``.
|
||||
the loglevel. It is advisable to set it to a verbose level like ``Debug`` or
|
||||
``Info``.
|
||||
|
||||
The logfile can be viewed either in the web interface or can be found in the
|
||||
filesystem in the ownCloud server data dir.
|
||||
|
||||
:Webserver Logfiles:
|
||||
Also, please take a look at your webservers error log file to check if there
|
||||
are problems. For apache on linux, the error logs usually can be found at
|
||||
are problems. For Apache on Linux, the error logs usually can be found at
|
||||
``/var/log/apache2``. A file called ``error_log`` shows errors like PHP code
|
||||
problems. A file called ``access_log`` usually records all requests handled
|
||||
by the server. Especially the access_log is a very good debugging tool as the
|
||||
@@ -83,4 +112,3 @@ log line contains a lot of information of every request and it's result.
|
||||
More information about the apache logging can be found at
|
||||
``http://httpd.apache.org/docs/current/logs.html``.
|
||||
|
||||
|
||||
|
||||
@@ -7,11 +7,42 @@ application menu. In the system tray, an ownCloud icon appears.
|
||||
|
||||
.. index:: start application
|
||||
|
||||
A left click on the tray icon open a status dialog which gives an overview on
|
||||
the configured sync folders and allows to add and remove more sync folder
|
||||
connections as well as pausing a sync connection.
|
||||
Overview
|
||||
--------
|
||||
|
||||
A right click on the tray icon gives other configuration options.
|
||||
ownCloud is represented by an icon in the Desktop's system tray, also known
|
||||
as notification area.
|
||||
|
||||
The clients menu is accessed with a right click (Windows, Linux) or left click
|
||||
(Mac OS).
|
||||
|
||||
The status of the current sync can be observed in the Status dialog, available
|
||||
trough the ``Open status...`` option. On Windows, a left click on the tray icon
|
||||
also opens the status dialog.
|
||||
|
||||
.. note:: Until the intial setup has finished, the Connection Wizard will be
|
||||
shown instead when left-clicking on Windows.
|
||||
|
||||
The dialog provides an overview on the configured sync folders and allows to add
|
||||
and remove more sync folder connections as well as pausing a sync connection.
|
||||
|
||||
Changing your password
|
||||
----------------------
|
||||
|
||||
Use the ``Configure`` option. It will open the Connection Wizard, which next to
|
||||
reconfiguring your connection to use a different user or server also will allow
|
||||
to change the password for the local account, or to switch from HTTP to HTTPS.
|
||||
|
||||
Setting up a proxy
|
||||
------------------
|
||||
|
||||
By default, the configured system proxy will be picked up. This may not be
|
||||
working reliable on some Linux distributions, as only the ``http_proxy``
|
||||
variable gets parsed. You can configure a proxy different from your
|
||||
system default by choosing ``Configure proxy...`` from the menu.
|
||||
|
||||
By default, ownCloud expects a HTTP proxy. If you want to specify a SOCKS5
|
||||
proxy instead, tick the "Use as SOCKSv5 proxy" option.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
@@ -20,6 +20,8 @@ PHP version:
|
||||
|
||||
ownCloud version:
|
||||
|
||||
Storage backend:
|
||||
|
||||
### Client configuration
|
||||
Client version:
|
||||
|
||||
@@ -31,18 +33,14 @@ Installation path of client:
|
||||
|
||||
### Logs
|
||||
|
||||
#### output of `owncloud --logwindow` or `owncloud --logfile log.txt`
|
||||
```
|
||||
Insert your log output here
|
||||
```
|
||||
Please use Gist (https://gist.github.com/) or a similar code paster for longer
|
||||
logs.
|
||||
|
||||
#### Web server error log
|
||||
```
|
||||
Insert your webserver log here
|
||||
```
|
||||
```Template for output < 10 lines```
|
||||
|
||||
#### ownCloud log (data/owncloud.log)
|
||||
```
|
||||
Insert your ownCloud log here
|
||||
```
|
||||
1. Output of `owncloud --logwindow` or `owncloud --logfile log.txt`
|
||||
|
||||
2. Web server error log:
|
||||
|
||||
3. ownCloud log (data/owncloud.log):
|
||||
|
||||
|
||||
@@ -140,6 +140,8 @@ Application::Application(int &argc, char **argv) :
|
||||
|
||||
connect( _statusDialog, SIGNAL(removeFolderAlias( const QString&)),
|
||||
SLOT(slotRemoveFolder(const QString&)));
|
||||
connect( _statusDialog, SIGNAL(resetFolderAlias( const QString&)),
|
||||
SLOT(slotResetFolder(const QString&)));
|
||||
connect( _statusDialog, SIGNAL(enableFolderAlias(QString,bool)),
|
||||
SLOT(slotEnableFolder(QString,bool)));
|
||||
connect( _statusDialog, SIGNAL(infoFolderAlias(const QString&)),
|
||||
@@ -373,8 +375,6 @@ void Application::slotAuthCheck( const QString& ,QNetworkReply *reply )
|
||||
_actionAddFolder->setEnabled( true );
|
||||
_actionOpenStatus->setEnabled( true );
|
||||
setupContextMenu();
|
||||
} else {
|
||||
slotFetchCredentials();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -799,21 +799,36 @@ void Application::slotAbout()
|
||||
void Application::slotRemoveFolder( const QString& alias )
|
||||
{
|
||||
int ret = QMessageBox::question( 0, tr("Confirm Folder Remove"),
|
||||
tr("<p>Do you really want to stop syncing the upload folder <i>%1</i>?</p>"
|
||||
tr("<p>Do you really want to stop syncing the folder <i>%1</i>?</p>"
|
||||
"<p><b>Note:</b> This will not remove the files from your client.</p>").arg(alias),
|
||||
QMessageBox::Yes|QMessageBox::No );
|
||||
|
||||
if( ret == QMessageBox::No ) {
|
||||
return;
|
||||
}
|
||||
Folder *f = _folderMan->folder(alias);
|
||||
|
||||
_folderMan->slotRemoveFolder( alias );
|
||||
_statusDialog->slotRemoveSelectedFolder( );
|
||||
computeOverallSyncStatus();
|
||||
setupContextMenu();
|
||||
}
|
||||
|
||||
void Application::slotResetFolder( const QString & alias )
|
||||
{
|
||||
int ret = QMessageBox::question( 0, tr("Confirm Folder Reset"),
|
||||
tr("<p>Do you really want to reset folder <i>%1</i> and rebuild your client database?</p>"
|
||||
"<p><b>Note:</b> While no files will be removed, this can cause significant data "
|
||||
"traffic and take several minutes to hours, depending on the size of the folder.</p>").arg(alias),
|
||||
QMessageBox::Yes|QMessageBox::No );
|
||||
if( ret == QMessageBox::No ) {
|
||||
return;
|
||||
}
|
||||
|
||||
Folder *f = _folderMan->folder(alias);
|
||||
f->slotTerminateSync();
|
||||
f->wipe();
|
||||
_folderMan->slotScheduleAllFolders();
|
||||
}
|
||||
|
||||
// Open the File list info dialog.
|
||||
void Application::slotInfoFolder( const QString& alias )
|
||||
{
|
||||
|
||||
@@ -61,6 +61,7 @@ protected slots:
|
||||
void slotAddFolder();
|
||||
void slotOpenStatus();
|
||||
void slotRemoveFolder( const QString& );
|
||||
void slotResetFolder( const QString& );
|
||||
void slotEnableFolder( const QString&, const bool );
|
||||
void slotInfoFolder( const QString& );
|
||||
void slotConfigure();
|
||||
|
||||
@@ -123,7 +123,7 @@ void CredentialStore::fetchCredentials()
|
||||
_inputDialog->setTextEchoMode( QLineEdit::Password );
|
||||
|
||||
connect(_inputDialog, SIGNAL(finished(int)), SLOT(slotUserDialogDone(int)));
|
||||
_inputDialog->exec();
|
||||
_inputDialog->open();
|
||||
break;
|
||||
}
|
||||
case CredentialStore::Settings: {
|
||||
@@ -360,9 +360,9 @@ void CredentialStore::slotKeyChainWriteFinished( QKeychain::Job *job )
|
||||
qDebug() << "Error with keychain: " << pwdJob->errorString();
|
||||
if( err == NoBackendAvailable || err == NotImplemented ||
|
||||
pwdJob->errorString().contains(QLatin1String("Could not open wallet"))) {
|
||||
_state = NoKeychainBackend;
|
||||
_type = Settings;
|
||||
saveCredentials();
|
||||
_state = NoKeychainBackend;
|
||||
} else {
|
||||
_state = Error;
|
||||
}
|
||||
|
||||
@@ -58,6 +58,8 @@ CSyncThread::~CSyncThread()
|
||||
|
||||
}
|
||||
|
||||
//Convert an error code from csync to a user readable string.
|
||||
// Keep that function thread safe as it can be called from the sync thread or the main thread
|
||||
QString CSyncThread::csyncErrorToString( CSYNC_ERROR_CODE err, const char *errString )
|
||||
{
|
||||
QString errStr;
|
||||
@@ -106,8 +108,6 @@ QString CSyncThread::csyncErrorToString( CSYNC_ERROR_CODE err, const char *errSt
|
||||
break;
|
||||
case CSYNC_ERR_ACCESS_FAILED:
|
||||
errStr = tr("<p>The target directory does not exist.</p><p>Please check the sync setup.</p>");
|
||||
// this is critical. The database has to be removed.
|
||||
emit wipeDb();
|
||||
break;
|
||||
case CSYNC_ERR_REMOTE_CREATE:
|
||||
case CSYNC_ERR_REMOTE_STAT:
|
||||
@@ -250,8 +250,8 @@ int CSyncThread::treewalkError(TREE_WALK_FILE* file)
|
||||
return 0;
|
||||
|
||||
if( file &&
|
||||
file->instruction == CSYNC_INSTRUCTION_STAT_ERROR ||
|
||||
file->instruction == CSYNC_INSTRUCTION_ERROR ) {
|
||||
(file->instruction == CSYNC_INSTRUCTION_STAT_ERROR ||
|
||||
file->instruction == CSYNC_INSTRUCTION_ERROR) ) {
|
||||
_mutex.lock();
|
||||
_syncedItems[indx]._instruction = file->instruction;
|
||||
_mutex.unlock();
|
||||
|
||||
@@ -38,7 +38,7 @@ public:
|
||||
CSyncThread(CSYNC *);
|
||||
~CSyncThread();
|
||||
|
||||
QString csyncErrorToString( CSYNC_ERROR_CODE, const char * );
|
||||
static QString csyncErrorToString( CSYNC_ERROR_CODE, const char * );
|
||||
|
||||
Q_INVOKABLE void startSync();
|
||||
|
||||
|
||||
@@ -374,26 +374,23 @@ QString MirallConfigFile::ownCloudPasswd( const QString& connection ) const
|
||||
settings.setIniCodec( "UTF-8" );
|
||||
settings.beginGroup( con );
|
||||
|
||||
QString pwd;
|
||||
|
||||
QByteArray pwdba = settings.value(QLatin1String("passwd")).toByteArray();
|
||||
if( pwdba.isEmpty() ) {
|
||||
// check the password entry, cleartext from before
|
||||
// read it and convert to base64, delete the cleartext entry.
|
||||
QString p = settings.value(QLatin1String("password")).toString();
|
||||
|
||||
if( ! p.isEmpty() ) {
|
||||
// its there, save base64-encoded and delete.
|
||||
|
||||
pwdba = p.toUtf8();
|
||||
settings.setValue( QLatin1String("passwd"), QVariant(pwdba.toBase64()) );
|
||||
settings.remove( QLatin1String("password") );
|
||||
settings.sync();
|
||||
}
|
||||
if( !pwdba.isEmpty() ) {
|
||||
return QString::fromUtf8( QByteArray::fromBase64(pwdba) );
|
||||
}
|
||||
pwd = QString::fromUtf8( QByteArray::fromBase64(pwdba) );
|
||||
|
||||
return pwd;
|
||||
// check the password entry, cleartext from before
|
||||
// read it and convert to base64, delete the cleartext entry.
|
||||
QString p = settings.value(QLatin1String("password")).toString();
|
||||
|
||||
if( ! p.isEmpty() ) {
|
||||
// its there, save base64-encoded and delete.
|
||||
pwdba = p.toUtf8();
|
||||
settings.setValue( QLatin1String("passwd"), QVariant(pwdba.toBase64()) );
|
||||
settings.remove( QLatin1String("password") );
|
||||
settings.sync();
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
QString MirallConfigFile::ownCloudVersion() const
|
||||
@@ -562,7 +559,7 @@ int MirallConfigFile::proxyPort() const
|
||||
|
||||
bool MirallConfigFile::proxyNeedsAuth() const
|
||||
{
|
||||
return getValue(QLatin1String("needsAuth"), QLatin1String("proxy")).toInt();
|
||||
return getValue(QLatin1String("needsAuth"), QLatin1String("proxy")).toBool();
|
||||
}
|
||||
|
||||
QString MirallConfigFile::proxyUser() const
|
||||
|
||||
@@ -69,7 +69,6 @@ ownCloudFolder::ownCloudFolder(const QString &alias,
|
||||
, _csync(0)
|
||||
, _csyncError(false)
|
||||
, _csyncUnavail(false)
|
||||
, _wipeDb(false)
|
||||
{
|
||||
ServerActionNotifier *notifier = new ServerActionNotifier(this);
|
||||
connect(notifier, SIGNAL(guiLog(QString,QString)), Logger::instance(), SIGNAL(guiLog(QString,QString)));
|
||||
@@ -99,7 +98,9 @@ ownCloudFolder::ownCloudFolder(const QString &alias,
|
||||
csync_set_auth_callback( _csync_ctx, getauth );
|
||||
|
||||
if( csync_init( _csync_ctx ) < 0 ) {
|
||||
qDebug() << "Could not initialize csync!";
|
||||
qDebug() << "Could not initialize csync!" << csync_get_error(_csync_ctx) << csync_get_error_string(_csync_ctx);
|
||||
slotCSyncError(CSyncThread::csyncErrorToString(csync_get_error(_csync_ctx), csync_get_error_string(_csync_ctx)));
|
||||
csync_destroy(_csync_ctx);
|
||||
_csync_ctx = 0;
|
||||
}
|
||||
setProxy();
|
||||
@@ -260,6 +261,13 @@ void ownCloudFolder::startSync()
|
||||
|
||||
void ownCloudFolder::startSync(const QStringList &pathList)
|
||||
{
|
||||
if (!_csync_ctx) {
|
||||
qDebug() << Q_FUNC_INFO << "_csync_ctx is empty. probably because csync_init has failed.";
|
||||
// the error should already be set
|
||||
QMetaObject::invokeMethod(this, "slotCSyncFinished", Qt::QueuedConnection);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_thread && _thread->isRunning()) {
|
||||
qCritical() << "* ERROR csync is still running and new sync requested.";
|
||||
return;
|
||||
@@ -271,7 +279,6 @@ void ownCloudFolder::startSync(const QStringList &pathList)
|
||||
_errors.clear();
|
||||
_csyncError = false;
|
||||
_csyncUnavail = false;
|
||||
_wipeDb = false;
|
||||
|
||||
MirallConfigFile cfgFile;
|
||||
|
||||
@@ -333,7 +340,6 @@ void ownCloudFolder::slotCSyncFinished()
|
||||
qDebug() << " ** error Strings: " << _errors;
|
||||
_syncResult.setErrorStrings( _errors );
|
||||
qDebug() << " * owncloud csync thread finished with error";
|
||||
if( _wipeDb ) wipe();
|
||||
} else if (_csyncUnavail) {
|
||||
_syncResult.setStatus(SyncResult::Unavailable);
|
||||
} else {
|
||||
@@ -427,7 +433,6 @@ void ownCloudFolder::wipe()
|
||||
if( ctmpFile.exists() ) {
|
||||
ctmpFile.remove();
|
||||
}
|
||||
_wipeDb = false;
|
||||
}
|
||||
|
||||
ServerActionNotifier::ServerActionNotifier(QObject *parent)
|
||||
@@ -502,10 +507,10 @@ void ownCloudFolder::slotAboutToRemoveAllFiles(SyncFileItem::Direction direction
|
||||
{
|
||||
QString msg = direction == SyncFileItem::Down ?
|
||||
tr("This sync would remove all the files in the local sync folder '%1'.\n"
|
||||
"If you or your administrator have reset your account on the server, choose"
|
||||
"If you or your administrator have reset your account on the server, choose "
|
||||
"\"Keep files\". If you want your data to be removed, choose \"Remove all files\".") :
|
||||
tr("This sync would remove all the files in the sync folder '%1'.\n"
|
||||
"This might be because the folder was silently reconfigured, or that all"
|
||||
"This might be because the folder was silently reconfigured, or that all "
|
||||
"the file were manually removed.\n"
|
||||
"Are you sure you want to perform this operation?");
|
||||
QMessageBox msgBox(QMessageBox::Warning, tr("Remove All Files?"),
|
||||
|
||||
@@ -483,7 +483,10 @@ bool ownCloudInfo::certsUntrusted()
|
||||
|
||||
void ownCloudInfo::slotError( QNetworkReply::NetworkError err)
|
||||
{
|
||||
qDebug() << "ownCloudInfo Network Error: " << err;
|
||||
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
|
||||
|
||||
qDebug() << "ownCloudInfo Network Error"
|
||||
<< err << ":" << reply->errorString();
|
||||
|
||||
switch (err) {
|
||||
case QNetworkReply::ProxyConnectionRefusedError:
|
||||
|
||||
@@ -130,6 +130,9 @@
|
||||
<property name="sizeConstraint">
|
||||
<enum>QLayout::SetMinimumSize</enum>
|
||||
</property>
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::ExpandingFieldsGrow</enum>
|
||||
</property>
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QRadioButton" name="radioButton">
|
||||
<property name="text">
|
||||
@@ -159,7 +162,7 @@
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
@@ -213,7 +216,7 @@
|
||||
<item row="3" column="1">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
|
||||
@@ -94,6 +94,7 @@ void OwncloudSetupWizard::startWizard()
|
||||
_ocWizard->setMultipleFoldersExist(_folderMan->map().count() > 1);
|
||||
|
||||
_ocWizard->show();
|
||||
_ocWizard->raise();
|
||||
}
|
||||
|
||||
|
||||
@@ -235,10 +236,8 @@ void OwncloudSetupWizard::testOwnCloudConnect()
|
||||
// If there is already a config, take its proxy config.
|
||||
if( ownCloudInfo::instance()->isConfigured() ) {
|
||||
MirallConfigFile prevCfg;
|
||||
if( prevCfg.proxyType() != QNetworkProxy::DefaultProxy ) {
|
||||
cfgFile.setProxyType( prevCfg.proxyType(), prevCfg.proxyHostName(), prevCfg.proxyPort(),
|
||||
prevCfg.proxyNeedsAuth(), prevCfg.proxyUser(), prevCfg.proxyPassword() );
|
||||
}
|
||||
cfgFile.setProxyType( prevCfg.proxyType(), prevCfg.proxyHostName(), prevCfg.proxyPort(),
|
||||
prevCfg.proxyNeedsAuth(), prevCfg.proxyUser(), prevCfg.proxyPassword() );
|
||||
}
|
||||
|
||||
// now start ownCloudInfo to check the connection.
|
||||
|
||||
@@ -15,12 +15,14 @@
|
||||
#include "owncloudtheme.h"
|
||||
|
||||
#include <QString>
|
||||
#include <QDebug>
|
||||
#include <QVariant>
|
||||
#include <QPixmap>
|
||||
#include <QIcon>
|
||||
#include <QStyle>
|
||||
#include <QApplication>
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
#include "mirall/version.h"
|
||||
#include "config.h"
|
||||
|
||||
@@ -78,32 +80,6 @@ QString ownCloudTheme::about() const
|
||||
.arg(devString);
|
||||
}
|
||||
|
||||
QPixmap ownCloudTheme::splashScreen() const
|
||||
{
|
||||
return QPixmap(QLatin1String(":/mirall/resources/owncloud_splash.png"));
|
||||
}
|
||||
|
||||
QIcon ownCloudTheme::folderIcon( const QString& backend ) const
|
||||
{
|
||||
QString name;
|
||||
|
||||
if( backend == QLatin1String("owncloud")) {
|
||||
name = QLatin1String( "owncloud-framed" );
|
||||
}
|
||||
if( backend == QLatin1String("unison" )) {
|
||||
name = QLatin1String( "folder-sync" );
|
||||
}
|
||||
if( backend == QLatin1String("csync" )) {
|
||||
name = QLatin1String( "folder-remote" );
|
||||
}
|
||||
if( backend.isEmpty() || backend == QLatin1String("none") ) {
|
||||
name = QLatin1String("folder-grey");
|
||||
}
|
||||
|
||||
qDebug() << "==> load folder icon " << name;
|
||||
return themeIcon( name );
|
||||
}
|
||||
|
||||
QIcon ownCloudTheme::trayFolderIcon( const QString& ) const
|
||||
{
|
||||
QPixmap fallback = qApp->style()->standardPixmap(QStyle::SP_FileDialogNewFolder);
|
||||
@@ -121,6 +97,18 @@ QIcon ownCloudTheme::applicationIcon( ) const
|
||||
return themeIcon( QLatin1String("owncloud-icon") );
|
||||
}
|
||||
|
||||
QVariant ownCloudTheme::customMedia(Theme::CustomMediaType type)
|
||||
{
|
||||
if (type == Theme::oCSetupTop) {
|
||||
return QCoreApplication::translate("ownCloudTheme",
|
||||
"If you don't have an ownCloud server yet, "
|
||||
"see <a href=\"https://owncloud.com\">owncloud.com</a> for more info.",
|
||||
"Top text in setup wizard. Keep short!");
|
||||
} else {
|
||||
return QVariant();
|
||||
}
|
||||
}
|
||||
|
||||
QColor ownCloudTheme::wizardHeaderBackgroundColor() const
|
||||
{
|
||||
return QColor("#1d2d42");
|
||||
|
||||
@@ -34,6 +34,8 @@ public:
|
||||
QIcon folderDisabledIcon() const;
|
||||
QIcon applicationIcon() const;
|
||||
|
||||
QVariant customMedia(CustomMediaType type);
|
||||
|
||||
QColor wizardHeaderBackgroundColor() const;
|
||||
QColor wizardHeaderTitleColor() const;
|
||||
|
||||
|
||||
@@ -130,16 +130,12 @@ void OwncloudSetupPage::setServerUrl( const QString& newUrl )
|
||||
void OwncloudSetupPage::setupCustomization()
|
||||
{
|
||||
// set defaults for the customize labels.
|
||||
|
||||
// _ui.topLabel->hide();
|
||||
_ui.topLabel->hide();
|
||||
_ui.bottomLabel->hide();
|
||||
|
||||
Theme *theme = Theme::instance();
|
||||
QVariant variant = theme->customMedia( Theme::oCSetupTop );
|
||||
if( variant.isNull() ) {
|
||||
_ui.topLabel->setOpenExternalLinks(true);
|
||||
_ui.topLabel->setText("If you don't have an ownCloud server yet, see <a href=\"https://owncloud.com\">owncloud.com</a> for more info.");
|
||||
} else {
|
||||
if( !variant.isNull() ) {
|
||||
setupCustomMedia( variant, _ui.topLabel );
|
||||
}
|
||||
|
||||
@@ -407,8 +403,11 @@ void OwncloudWizard::setMultipleFoldersExist(bool exist)
|
||||
void OwncloudSetupPage::setConfigExists( bool config )
|
||||
{
|
||||
_configExists = config;
|
||||
setSubTitle( tr("<font color=\"%1\">Change your user credentials</font>")
|
||||
.arg(Theme::instance()->wizardHeaderTitleColor().name()));
|
||||
|
||||
if (config == true) {
|
||||
setSubTitle( tr("<font color=\"%1\">Change your user credentials</font>")
|
||||
.arg(Theme::instance()->wizardHeaderTitleColor().name()));
|
||||
}
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
|
||||
@@ -237,19 +237,15 @@ StatusDialog::StatusDialog( Theme *theme, QWidget *parent) :
|
||||
_folderList->setEditTriggers( QAbstractItemView::NoEditTriggers );
|
||||
connect(_ButtonClose, SIGNAL(clicked()), this, SLOT(accept()));
|
||||
connect(_ButtonRemove, SIGNAL(clicked()), this, SLOT(slotRemoveFolder()));
|
||||
|
||||
// hide these two for now...
|
||||
_ButtonFetch->setVisible( false );
|
||||
_ButtonPush->setVisible( false );
|
||||
connect(_ButtonReset, SIGNAL(clicked()), this, SLOT(slotResetFolder()));
|
||||
|
||||
connect(_ButtonEnable, SIGNAL(clicked()), this, SLOT(slotEnableFolder()));
|
||||
connect(_ButtonInfo, SIGNAL(clicked()), this, SLOT(slotInfoFolder()));
|
||||
connect(_ButtonAdd, SIGNAL(clicked()), this, SLOT(slotAddSync()));
|
||||
|
||||
_ButtonRemove->setEnabled(false);
|
||||
_ButtonFetch->setEnabled(false);
|
||||
_ButtonPush->setEnabled(false);
|
||||
_ButtonEnable->setEnabled(false);
|
||||
_ButtonReset->setEnabled(false);
|
||||
_ButtonInfo->setEnabled(false);
|
||||
_ButtonAdd->setEnabled(true);
|
||||
|
||||
@@ -270,9 +266,8 @@ void StatusDialog::slotFolderActivated( const QModelIndex& indx )
|
||||
bool state = indx.isValid();
|
||||
|
||||
_ButtonRemove->setEnabled( state );
|
||||
_ButtonFetch->setEnabled( state );
|
||||
_ButtonPush->setEnabled( state );
|
||||
_ButtonEnable->setEnabled( state );
|
||||
_ButtonReset->setEnabled( state );
|
||||
_ButtonInfo->setEnabled( state );
|
||||
|
||||
if ( state ) {
|
||||
@@ -324,7 +319,6 @@ void StatusDialog::buttonsSetEnabled()
|
||||
{
|
||||
bool haveFolders = _folderList->model()->rowCount() > 0;
|
||||
|
||||
_ButtonRemove->setEnabled(false);
|
||||
if( _theme->singleSyncFolder() ) {
|
||||
// only one folder synced folder allowed.
|
||||
_ButtonAdd->setVisible(!haveFolders);
|
||||
@@ -338,9 +332,9 @@ void StatusDialog::buttonsSetEnabled()
|
||||
|
||||
_ButtonEnable->setEnabled(isSelected);
|
||||
_ButtonRemove->setEnabled(isSelected);
|
||||
_ButtonFetch->setEnabled(isSelected);
|
||||
_ButtonInfo->setEnabled(isSelected);
|
||||
_ButtonPush->setEnabled(isSelected);
|
||||
_ButtonReset->setEnabled(isSelected);
|
||||
|
||||
}
|
||||
|
||||
void StatusDialog::slotUpdateFolderState( Folder *folder )
|
||||
@@ -371,8 +365,6 @@ void StatusDialog::folderToModelItem( QStandardItem *item, Folder *f )
|
||||
{
|
||||
if( ! item || !f ) return;
|
||||
|
||||
QIcon icon = _theme->folderIcon( f->backend() );
|
||||
item->setData( icon, FolderViewDelegate::FolderStatusIconRole );
|
||||
item->setData( f->nativePath(), FolderViewDelegate::FolderPathRole );
|
||||
item->setData( f->secondPath(), FolderViewDelegate::FolderSecondPathRole );
|
||||
item->setData( f->alias(), FolderViewDelegate::FolderAliasRole );
|
||||
@@ -408,6 +400,15 @@ void StatusDialog::slotRemoveFolder()
|
||||
slotCheckConnection();
|
||||
}
|
||||
|
||||
void StatusDialog::slotResetFolder()
|
||||
{
|
||||
QModelIndex selected = _folderList->selectionModel()->currentIndex();
|
||||
if( selected.isValid() ) {
|
||||
QString alias = _model->data( selected, FolderViewDelegate::FolderAliasRole ).toString();
|
||||
emit(resetFolderAlias( alias ));
|
||||
}
|
||||
}
|
||||
|
||||
void StatusDialog::slotRemoveSelectedFolder()
|
||||
{
|
||||
QModelIndex selected = _folderList->selectionModel()->currentIndex();
|
||||
@@ -418,30 +419,6 @@ void StatusDialog::slotRemoveSelectedFolder()
|
||||
slotCheckConnection();
|
||||
}
|
||||
|
||||
void StatusDialog::slotFetchFolder()
|
||||
{
|
||||
QModelIndex selected = _folderList->selectionModel()->currentIndex();
|
||||
if( selected.isValid() ) {
|
||||
QString alias = _model->data( selected, FolderViewDelegate::FolderAliasRole ).toString();
|
||||
qDebug() << "Fetch Folder alias " << alias;
|
||||
if( !alias.isEmpty() ) {
|
||||
emit(fetchFolderAlias( alias ));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void StatusDialog::slotPushFolder()
|
||||
{
|
||||
QModelIndex selected = _folderList->selectionModel()->currentIndex();
|
||||
if( selected.isValid() ) {
|
||||
QString alias = _model->data( selected, FolderViewDelegate::FolderAliasRole ).toString();
|
||||
qDebug() << "Push Folder alias " << alias;
|
||||
if( !alias.isEmpty() ) {
|
||||
emit(pushFolderAlias( alias ));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void StatusDialog::slotEnableFolder()
|
||||
{
|
||||
QModelIndex selected = _folderList->selectionModel()->currentIndex();
|
||||
|
||||
@@ -72,8 +72,7 @@ public:
|
||||
|
||||
signals:
|
||||
void removeFolderAlias( const QString& );
|
||||
void fetchFolderAlias( const QString& );
|
||||
void pushFolderAlias( const QString& );
|
||||
void resetFolderAlias( const QString& );
|
||||
void enableFolderAlias( const QString&, const bool );
|
||||
void infoFolderAlias( const QString& );
|
||||
void openFolderAlias( const QString& );
|
||||
@@ -83,9 +82,8 @@ signals:
|
||||
|
||||
public slots:
|
||||
void slotRemoveFolder();
|
||||
void slotResetFolder();
|
||||
void slotRemoveSelectedFolder();
|
||||
void slotFetchFolder();
|
||||
void slotPushFolder();
|
||||
void slotFolderActivated( const QModelIndex& );
|
||||
void slotOpenOC();
|
||||
void slotEnableFolder();
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>544</width>
|
||||
<height>308</height>
|
||||
<height>313</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -42,30 +42,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="_ButtonRemove">
|
||||
<property name="text">
|
||||
<string>Remove...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="_ButtonFetch">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Fetch...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="_ButtonPush">
|
||||
<property name="text">
|
||||
<string>Push...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="_ButtonEnable">
|
||||
<property name="text">
|
||||
@@ -73,13 +49,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="_ButtonInfo">
|
||||
<property name="text">
|
||||
<string>Info...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
@@ -88,11 +57,45 @@
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>56</height>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="_ButtonRemove">
|
||||
<property name="text">
|
||||
<string>Remove</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="_ButtonReset">
|
||||
<property name="text">
|
||||
<string>Reset</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="_ButtonInfo">
|
||||
<property name="text">
|
||||
<string>Info...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
|
||||
@@ -82,7 +82,8 @@ QString Theme::version() const
|
||||
|
||||
QIcon Theme::trayFolderIcon( const QString& backend ) const
|
||||
{
|
||||
return folderIcon( backend );
|
||||
Q_UNUSED(backend)
|
||||
return applicationIcon();
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -70,11 +70,6 @@ public:
|
||||
*/
|
||||
virtual QString configFileName() const = 0;
|
||||
|
||||
/**
|
||||
* get a folder icon for a given backend in a given size.
|
||||
*/
|
||||
virtual QIcon folderIcon( const QString& ) const = 0;
|
||||
|
||||
/**
|
||||
* the icon that is shown in the tray context menu left of the folder name
|
||||
*/
|
||||
@@ -86,7 +81,6 @@ public:
|
||||
virtual QIcon syncStateIcon( SyncResult::Status, bool sysTray = false ) const;
|
||||
|
||||
virtual QIcon folderDisabledIcon() const = 0;
|
||||
virtual QPixmap splashScreen() const = 0;
|
||||
|
||||
virtual QIcon applicationIcon() const = 0;
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user