Compare commits
34
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
123b1f01e4 | ||
|
|
865f62e3eb | ||
|
|
3ea93f52ee | ||
|
|
b53e545ebc | ||
|
|
157a4c891c | ||
|
|
ad9ea07309 | ||
|
|
fc483cdfc6 | ||
|
|
9033838cf2 | ||
|
|
8e5d2d5905 | ||
|
|
18aa66dabb | ||
|
|
a2f7b78453 | ||
|
|
5c026cbe1d | ||
|
|
dc51476897 | ||
|
|
39eaa577e0 | ||
|
|
1f006481ee | ||
|
|
60faabcbe2 | ||
|
|
d3f1eaf1a3 | ||
|
|
f568e76fd4 | ||
|
|
e947223aaa | ||
|
|
8311162be3 | ||
|
|
75523556e8 | ||
|
|
c82b5d4982 | ||
|
|
1c3158099c | ||
|
|
bdbca75dfa | ||
|
|
124b189cc0 | ||
|
|
de38b46392 | ||
|
|
e1975644d6 | ||
|
|
d9fd27a9e8 | ||
|
|
32425c5561 | ||
|
|
8d20923881 | ||
|
|
3a35b8b26c | ||
|
|
36c93b755a | ||
|
|
ea8c3debea | ||
|
|
49bc74e7a0 |
@@ -26,6 +26,7 @@ Jakob Borg <jakob@nym.se>
|
|||||||
James Patterson <jamespatterson@operamail.com> <jpjp@users.noreply.github.com>
|
James Patterson <jamespatterson@operamail.com> <jpjp@users.noreply.github.com>
|
||||||
Jens Diemer <github.com@jensdiemer.de> <git@jensdiemer.de>
|
Jens Diemer <github.com@jensdiemer.de> <git@jensdiemer.de>
|
||||||
Jochen Voss <voss@seehuhn.de>
|
Jochen Voss <voss@seehuhn.de>
|
||||||
|
Johan Vromans <jvromans@squirrel.nl>
|
||||||
Karol Różycki <rozycki.karol@gmail.com>
|
Karol Różycki <rozycki.karol@gmail.com>
|
||||||
Kamada Ken'ichi <kamada@nanohz.org>
|
Kamada Ken'ichi <kamada@nanohz.org>
|
||||||
Lode Hoste <zillode@zillode.be>
|
Lode Hoste <zillode@zillode.be>
|
||||||
|
|||||||
+3
-3
@@ -93,8 +93,8 @@ The Syncthing core team currently consists of the following members;
|
|||||||
|
|
||||||
## Licensing
|
## Licensing
|
||||||
|
|
||||||
All contributions are made under the same GPL license as the rest of the
|
All contributions are made under the same MPLv2 license as the rest of
|
||||||
project, except documentation, user interface text and translation
|
the project, except documentation, user interface text and translation
|
||||||
strings which are licensed under the Creative Commons Attribution 4.0
|
strings which are licensed under the Creative Commons Attribution 4.0
|
||||||
International License. You retain the copyright to code you have
|
International License. You retain the copyright to code you have
|
||||||
written.
|
written.
|
||||||
@@ -137,4 +137,4 @@ Yes please!
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
GPLv3
|
MPLv2
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ pluby <phill.luby@newredo.com>
|
|||||||
pyfisch <pyfisch@gmail.com>
|
pyfisch <pyfisch@gmail.com>
|
||||||
rumpelsepp <stefan@sevenbyte.org>
|
rumpelsepp <stefan@sevenbyte.org>
|
||||||
qbit <qbit@deftly.net>
|
qbit <qbit@deftly.net>
|
||||||
|
sciurius <jvromans@squirrel.nl>
|
||||||
seehuhn <voss@seehuhn.de>
|
seehuhn <voss@seehuhn.de>
|
||||||
snnd <dw@risu.io>
|
snnd <dw@risu.io>
|
||||||
timabell <tim@timwise.co.uk>
|
timabell <tim@timwise.co.uk>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ syncthing
|
|||||||
|
|
||||||
[](http://build.syncthing.net/job/syncthing/lastBuild/)
|
[](http://build.syncthing.net/job/syncthing/lastBuild/)
|
||||||
[](http://godoc.org/github.com/syncthing/syncthing)
|
[](http://godoc.org/github.com/syncthing/syncthing)
|
||||||
[](http://opensource.org/licenses/GPL-3.0)
|
[](https://www.mozilla.org/MPL/2.0/)
|
||||||
|
|
||||||
This is the `syncthing` project. The following are the project goals:
|
This is the `syncthing` project. The following are the project goals:
|
||||||
|
|
||||||
@@ -57,5 +57,4 @@ documentation](https://github.com/syncthing/syncthing/wiki/) is on the
|
|||||||
Github wiki.
|
Github wiki.
|
||||||
|
|
||||||
All code is licensed under the
|
All code is licensed under the
|
||||||
[GPL](https://github.com/syncthing/syncthing/blob/master/LICENSE), v3 or
|
[MPLv2](https://github.com/syncthing/syncthing/blob/master/LICENSE).
|
||||||
later.
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// +build ignore
|
// +build ignore
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// +build ignore
|
// +build ignore
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2015 The Syncthing Authors.
|
// Copyright (C) 2015 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
+33
-20
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
@@ -46,8 +37,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type guiError struct {
|
type guiError struct {
|
||||||
Time time.Time
|
Time time.Time `json:"time"`
|
||||||
Error string
|
Error string `json:"error"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -133,6 +124,7 @@ func startGUI(cfg config.GUIConfiguration, assetDir string, m *model.Model) erro
|
|||||||
getRestMux.HandleFunc("/rest/tree", withModel(m, restGetTree))
|
getRestMux.HandleFunc("/rest/tree", withModel(m, restGetTree))
|
||||||
getRestMux.HandleFunc("/rest/stats/device", withModel(m, restGetDeviceStats))
|
getRestMux.HandleFunc("/rest/stats/device", withModel(m, restGetDeviceStats))
|
||||||
getRestMux.HandleFunc("/rest/stats/folder", withModel(m, restGetFolderStats))
|
getRestMux.HandleFunc("/rest/stats/folder", withModel(m, restGetFolderStats))
|
||||||
|
getRestMux.HandleFunc("/rest/filestatus", withModel(m, restGetFileStatus))
|
||||||
|
|
||||||
// Debug endpoints, not for general use
|
// Debug endpoints, not for general use
|
||||||
getRestMux.HandleFunc("/rest/debug/peerCompletion", withModel(m, restGetPeerCompletion))
|
getRestMux.HandleFunc("/rest/debug/peerCompletion", withModel(m, restGetPeerCompletion))
|
||||||
@@ -374,6 +366,27 @@ func restGetFolderStats(m *model.Model, w http.ResponseWriter, r *http.Request)
|
|||||||
json.NewEncoder(w).Encode(res)
|
json.NewEncoder(w).Encode(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func restGetFileStatus(m *model.Model, w http.ResponseWriter, r *http.Request) {
|
||||||
|
qs := r.URL.Query()
|
||||||
|
folder := qs.Get("folder")
|
||||||
|
file := qs.Get("file")
|
||||||
|
withBlocks := qs.Get("blocks") != ""
|
||||||
|
gf, _ := m.CurrentGlobalFile(folder, file)
|
||||||
|
lf, _ := m.CurrentFolderFile(folder, file)
|
||||||
|
|
||||||
|
if !withBlocks {
|
||||||
|
gf.Blocks = nil
|
||||||
|
lf.Blocks = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
av := m.Availability(folder, file)
|
||||||
|
json.NewEncoder(w).Encode(map[string]interface{}{
|
||||||
|
"global": gf,
|
||||||
|
"local": lf,
|
||||||
|
"availability": av,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func restGetConfig(w http.ResponseWriter, r *http.Request) {
|
func restGetConfig(w http.ResponseWriter, r *http.Request) {
|
||||||
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
json.NewEncoder(w).Encode(cfg.Raw())
|
json.NewEncoder(w).Encode(cfg.Raw())
|
||||||
@@ -824,12 +837,12 @@ func toNeedSlice(fs []db.FileInfoTruncated) []map[string]interface{} {
|
|||||||
output := make([]map[string]interface{}, len(fs))
|
output := make([]map[string]interface{}, len(fs))
|
||||||
for i, file := range fs {
|
for i, file := range fs {
|
||||||
output[i] = map[string]interface{}{
|
output[i] = map[string]interface{}{
|
||||||
"Name": file.Name,
|
"name": file.Name,
|
||||||
"Flags": file.Flags,
|
"flags": file.Flags,
|
||||||
"Modified": file.Modified,
|
"modified": file.Modified,
|
||||||
"Version": file.Version,
|
"version": file.Version,
|
||||||
"LocalVersion": file.LocalVersion,
|
"localVersion": file.LocalVersion,
|
||||||
"Size": file.Size(),
|
"size": file.Size(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return output
|
return output
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
//+build solaris
|
//+build solaris
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
//+build !windows,!solaris
|
//+build !windows,!solaris
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
//+build windows
|
//+build windows
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
+9
-13
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
@@ -495,8 +486,13 @@ func syncthingMain() {
|
|||||||
readRateLimit = ratelimit.NewBucketWithRate(float64(1000*opts.MaxRecvKbps), int64(5*1000*opts.MaxRecvKbps))
|
readRateLimit = ratelimit.NewBucketWithRate(float64(1000*opts.MaxRecvKbps), int64(5*1000*opts.MaxRecvKbps))
|
||||||
}
|
}
|
||||||
|
|
||||||
if opts.MaxRecvKbps > 0 || opts.MaxSendKbps > 0 {
|
if (opts.MaxRecvKbps > 0 || opts.MaxSendKbps > 0) && !opts.LimitBandwidthInLan {
|
||||||
lans, _ = osutil.GetLans()
|
lans, _ = osutil.GetLans()
|
||||||
|
networks := make([]string, 0, len(lans))
|
||||||
|
for _, lan := range lans {
|
||||||
|
networks = append(networks, lan.String())
|
||||||
|
}
|
||||||
|
l.Infoln("Local networks:", strings.Join(networks, ", "))
|
||||||
}
|
}
|
||||||
|
|
||||||
dbFile := filepath.Join(confDir, "index")
|
dbFile := filepath.Join(confDir, "index")
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// +build solaris
|
// +build solaris
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// +build freebsd openbsd dragonfly
|
// +build freebsd openbsd dragonfly
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// +build !windows
|
// +build !windows
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// +build windows
|
// +build windows
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// +build !solaris,!windows
|
// +build !solaris,!windows
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// +build ignore
|
// +build ignore
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// +build ignore
|
// +build ignore
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// +build ignore
|
// +build ignore
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ After=network.target
|
|||||||
[Service]
|
[Service]
|
||||||
User=%i
|
User=%i
|
||||||
Environment=STNORESTART=yes
|
Environment=STNORESTART=yes
|
||||||
ExecStart=/usr/bin/syncthing
|
ExecStart=/usr/bin/syncthing -no-browser -logflags=0
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartPreventExitStatus=1
|
RestartPreventExitStatus=1
|
||||||
SuccessExitStatus=2
|
SuccessExitStatus=2
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ After=network.target
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Environment=STNORESTART=yes
|
Environment=STNORESTART=yes
|
||||||
ExecStart=/usr/bin/syncthing
|
ExecStart=/usr/bin/syncthing -no-browser -logflags=0
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartPreventExitStatus=1
|
RestartPreventExitStatus=1
|
||||||
SuccessExitStatus=2
|
SuccessExitStatus=2
|
||||||
|
|||||||
@@ -1,18 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
body {
|
body {
|
||||||
@@ -216,4 +208,4 @@ ul.three-columns li, ul.two-columns li {
|
|||||||
.navbar-fixed-bottom {
|
.navbar-fixed-bottom {
|
||||||
position: static;
|
position: static;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 429 117.3" enable-background="new 0 0 429 117.3" xml:space="preserve">
|
||||||
|
<g>
|
||||||
|
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="58.666" y1="117.332" x2="58.666" y2="-9.094947e-13">
|
||||||
|
<stop offset="0" style="stop-color:#0882C8"/>
|
||||||
|
<stop offset="1" style="stop-color:#26B6DB"/>
|
||||||
|
</linearGradient>
|
||||||
|
<circle fill="url(#SVGID_1_)" cx="58.7" cy="58.7" r="58.7"/>
|
||||||
|
<g>
|
||||||
|
<circle fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" cx="58.7" cy="58.5" r="43.7"/>
|
||||||
|
<g>
|
||||||
|
<path fill="#FFFFFF" d="M94.7,47.8c4.7,1.6,9.8-0.9,11.4-5.6c1.6-4.7-0.9-9.8-5.6-11.4c-4.7-1.6-9.8,0.9-11.4,5.6
|
||||||
|
C87.5,41.1,90,46.2,94.7,47.8z"/>
|
||||||
|
<line fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" x1="97.6" y1="39.4" x2="67.5" y2="64.4"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path fill="#FFFFFF" d="M77.6,91c-0.4,4.9,3.2,9.3,8.2,9.8c5,0.4,9.3-3.2,9.8-8.2c0.4-4.9-3.2-9.3-8.2-9.8
|
||||||
|
C82.4,82.4,78,86,77.6,91z"/>
|
||||||
|
<line fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" x1="86.5" y1="91.8" x2="67.5" y2="64.4"/>
|
||||||
|
</g>
|
||||||
|
<path fill="#FFFFFF" d="M60,69.3c2.7,4.2,8.3,5.4,12.4,2.7c4.2-2.7,5.4-8.3,2.7-12.4c-2.7-4.2-8.3-5.4-12.4-2.7
|
||||||
|
C58.5,59.5,57.3,65.1,60,69.3z"/>
|
||||||
|
<g>
|
||||||
|
<path fill="#FFFFFF" d="M21.2,61.4c-4.3-2.5-9.8-1.1-12.3,3.1c-2.5,4.3-1.1,9.8,3.1,12.3c4.3,2.5,9.8,1.1,12.3-3.1
|
||||||
|
C26.8,69.5,25.4,64,21.2,61.4z"/>
|
||||||
|
<line fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" x1="16.6" y1="69.1" x2="67.5" y2="64.4"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path fill="#0891D1" d="M163.8,50.2c-0.6-0.7-6.3-4.1-11.4-4.1c-3.4,0-5.2,1.2-5.2,3.5c0,2.9,3.2,3.7,8.9,5.2
|
||||||
|
c8.2,2.2,13.3,5,13.3,12.9c0,9.7-7.8,13-16,13c-6.2,0-13.1-2-18.2-5.3l4.3-8.6c0.8,0.8,7.5,5,14,5c3.5,0,5.2-1.1,5.2-3.2
|
||||||
|
c0-3.2-4.4-4-10.3-5.8c-7.9-2.4-11.5-5.3-11.5-11.8c0-9,7.2-13.9,15.7-13.9c6.1,0,11.6,2.5,15.4,4.7L163.8,50.2z"/>
|
||||||
|
<path fill="#0891D1" d="M175,85.1c1.7,0.5,3.3,0.8,4.4,0.8c2,0,3.3-1.5,4.2-5.5l-11.9-31.5h9.8l7.4,23.3l6.3-23.3h8.9l-12.1,36.6
|
||||||
|
c-1.7,5.3-6.2,8.7-11.8,8.8c-1.7,0-3.5-0.2-5.3-0.9V85.1z"/>
|
||||||
|
<path fill="#0891D1" d="M239.3,80.3h-9.6V62.6c0-4.1-1.7-5.9-4.3-5.9c-2.6,0-5.8,2.3-7,5.6v18.1h-9.6V48.8h8.6v5.3
|
||||||
|
c2.3-3.7,6.8-5.9,12.2-5.9c8.2,0,9.5,6.7,9.5,11.9V80.3z"/>
|
||||||
|
<path fill="#0891D1" d="M261.6,48.2c7.2,0,12.3,3.4,14.8,8.3l-9.4,2.8c-1.2-1.9-3.1-3-5.5-3c-4,0-7,3.2-7,8.2c0,5,3.1,8.3,7,8.3
|
||||||
|
c2.4,0,4.6-1.3,5.5-3.1l9.4,2.9c-2.3,4.9-7.6,8.3-14.8,8.3c-10.6,0-16.9-7.7-16.9-16.4S250.9,48.2,261.6,48.2z"/>
|
||||||
|
<path fill="#0891D1" d="M302.1,78.7c-2.6,1.1-6.2,2.3-9.7,2.3c-4.7,0-8.8-2.3-8.8-8.4V56.1h-4v-7.3h4v-10h9.6v10h6.4v7.3h-6.4v13.1
|
||||||
|
c0,2.1,1.2,2.9,2.8,2.9c1.4,0,3-0.6,4.2-1.1L302.1,78.7z"/>
|
||||||
|
<path fill="#0891D1" d="M337.2,80.3h-9.6V62.6c0-4.1-1.8-5.9-4.6-5.9c-2.3,0-5.5,2.2-6.7,5.6v18.1h-9.6V36.5h9.6v17.6
|
||||||
|
c2.3-3.7,6.3-5.9,10.9-5.9c8.5,0,9.9,6.5,9.9,11.9V80.3z"/>
|
||||||
|
<path fill="#0891D1" d="M343.4,45.2v-8.7h9.6v8.7H343.4z M343.4,80.3V48.8h9.6v31.5H343.4z"/>
|
||||||
|
<path fill="#0891D1" d="M389.9,80.3h-9.6V62.6c0-4.1-1.7-5.9-4.3-5.9c-2.6,0-5.8,2.3-7,5.6v18.1h-9.6V48.8h8.6v5.3
|
||||||
|
c2.3-3.7,6.8-5.9,12.2-5.9c8.2,0,9.5,6.7,9.5,11.9V80.3z"/>
|
||||||
|
<path fill="#0891D1" d="M395.5,64.6c0-9.2,6-16.3,14.6-16.3c4.7,0,8.4,2.2,10.6,5.8v-5.2h8.3v29.3c0,9.6-7.5,15.5-18.2,15.5
|
||||||
|
c-6.8,0-11.5-2.3-15-6.3l5.1-5.2c2.3,2.6,6,4.3,9.9,4.3c4.6,0,8.6-2.4,8.6-8.3v-3.1c-1.9,3.5-5.9,5.3-10,5.3
|
||||||
|
C401.1,80.5,395.5,73.3,395.5,64.6z M419.4,68.5v-6.6c-1.3-3.3-4.2-5.5-7.1-5.5c-4.1,0-7,4-7,8.4c0,4.6,3.2,8,7.5,8
|
||||||
|
C415.7,72.8,418.1,71,419.4,68.5z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.7 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 47 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB |
@@ -83,7 +83,7 @@
|
|||||||
"No File Versioning": "Bez verzí souborů",
|
"No File Versioning": "Bez verzí souborů",
|
||||||
"Notice": "Oznámení",
|
"Notice": "Oznámení",
|
||||||
"OK": "OK",
|
"OK": "OK",
|
||||||
"Off": "Vypnout",
|
"Off": "Vypnuta",
|
||||||
"Offline": "Offline",
|
"Offline": "Offline",
|
||||||
"Online": "Online",
|
"Online": "Online",
|
||||||
"Out Of Sync": "Nesesynchronizováno",
|
"Out Of Sync": "Nesesynchronizováno",
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
"Add new folder?": "Legg til ny mappe?",
|
"Add new folder?": "Legg til ny mappe?",
|
||||||
"Address": "Adresse",
|
"Address": "Adresse",
|
||||||
"Addresses": "Adresser",
|
"Addresses": "Adresser",
|
||||||
"All Data": "All Data",
|
"All Data": "Alle data",
|
||||||
"Allow Anonymous Usage Reporting?": "Tillat Anonym Innsamling Av Brukerdata?",
|
"Allow Anonymous Usage Reporting?": "Tillat Anonym Innsamling Av Brukerdata?",
|
||||||
"Anonymous Usage Reporting": "Anonym Innsamling Av Brukerdata",
|
"Anonymous Usage Reporting": "Anonym Innsamling Av Brukerdata",
|
||||||
"Any devices configured on an introducer device will be added to this device as well.": "Enheter konfigurert på en introduksjonsenhet vil også bli lagt til denne enheten.",
|
"Any devices configured on an introducer device will be added to this device as well.": "Enheter konfigurert på en introduksjonsenhet vil også bli lagt til denne enheten.",
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
"Changelog": "Endringslog",
|
"Changelog": "Endringslog",
|
||||||
"Close": "Lukk",
|
"Close": "Lukk",
|
||||||
"Comment, when used at the start of a line": "Kommentar, når det blir brukt i starten av en linje.",
|
"Comment, when used at the start of a line": "Kommentar, når det blir brukt i starten av en linje.",
|
||||||
"Compression": "Compression",
|
"Compression": "Komprimering",
|
||||||
"Compression is recommended in most setups.": "Komprimering er anbefalt i de fleste tilfeller.",
|
"Compression is recommended in most setups.": "Komprimering er anbefalt i de fleste tilfeller.",
|
||||||
"Connection Error": "Tilkoblingsfeil",
|
"Connection Error": "Tilkoblingsfeil",
|
||||||
"Copied from elsewhere": "Kopiert fra et annet sted",
|
"Copied from elsewhere": "Kopiert fra et annet sted",
|
||||||
@@ -73,8 +73,8 @@
|
|||||||
"Local Discovery": "Lokal Søking",
|
"Local Discovery": "Lokal Søking",
|
||||||
"Local State": "Lokal Tilstand",
|
"Local State": "Lokal Tilstand",
|
||||||
"Maximum Age": "Maksimal Levetid",
|
"Maximum Age": "Maksimal Levetid",
|
||||||
"Metadata Only": "Metadata Only",
|
"Metadata Only": "Kun metadata",
|
||||||
"Move to top of queue": "Move to top of queue",
|
"Move to top of queue": "Flytt til topp av kø",
|
||||||
"Multi level wildcard (matches multiple directory levels)": "Multinivåsøk (søker på flere mappenivå)",
|
"Multi level wildcard (matches multiple directory levels)": "Multinivåsøk (søker på flere mappenivå)",
|
||||||
"Never": "Aldri",
|
"Never": "Aldri",
|
||||||
"New Device": "Ny Enhet",
|
"New Device": "Ny Enhet",
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
"No File Versioning": "Ingen Versjonskontroll",
|
"No File Versioning": "Ingen Versjonskontroll",
|
||||||
"Notice": "Merknad",
|
"Notice": "Merknad",
|
||||||
"OK": "OK",
|
"OK": "OK",
|
||||||
"Off": "Off",
|
"Off": "Av",
|
||||||
"Offline": "Frakobla",
|
"Offline": "Frakobla",
|
||||||
"Online": "Tilkobla",
|
"Online": "Tilkobla",
|
||||||
"Out Of Sync": "Ikke Synkronisert",
|
"Out Of Sync": "Ikke Synkronisert",
|
||||||
@@ -97,8 +97,8 @@
|
|||||||
"Preview Usage Report": "Forhåndsvisning Av Datainnsamling",
|
"Preview Usage Report": "Forhåndsvisning Av Datainnsamling",
|
||||||
"Quick guide to supported patterns": "Kjapp innføring i godkjente mønster",
|
"Quick guide to supported patterns": "Kjapp innføring i godkjente mønster",
|
||||||
"RAM Utilization": "RAM-utnyttelse",
|
"RAM Utilization": "RAM-utnyttelse",
|
||||||
"Rescan": "Skann På Ny",
|
"Rescan": "Skann på nytt",
|
||||||
"Rescan All": "Rescan All",
|
"Rescan All": "Skann alt på nytt",
|
||||||
"Rescan Interval": "Skanneintervall",
|
"Rescan Interval": "Skanneintervall",
|
||||||
"Restart": "Omstart",
|
"Restart": "Omstart",
|
||||||
"Restart Needed": "Omstart Kreves",
|
"Restart Needed": "Omstart Kreves",
|
||||||
@@ -120,7 +120,7 @@
|
|||||||
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Vis i stedet for Eining ID i gruppestatus. Vil bli kringkastet til andre enheter som et valgfritt standardnavn.",
|
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Vis i stedet for Eining ID i gruppestatus. Vil bli kringkastet til andre enheter som et valgfritt standardnavn.",
|
||||||
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Vist i stedet for Mappe-ID i gruppestatus. Vil bli oppdatert til navnet enheten kringkaster dersom tomt.",
|
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Vist i stedet for Mappe-ID i gruppestatus. Vil bli oppdatert til navnet enheten kringkaster dersom tomt.",
|
||||||
"Shutdown": "Slå Av",
|
"Shutdown": "Slå Av",
|
||||||
"Shutdown Complete": "Shutdown Complete",
|
"Shutdown Complete": "Avslutning fullført",
|
||||||
"Simple File Versioning": "Enkel Versjonskontroll",
|
"Simple File Versioning": "Enkel Versjonskontroll",
|
||||||
"Single level wildcard (matches within a directory only)": "Enkeltnivåsøk (søker kun i en mappe)",
|
"Single level wildcard (matches within a directory only)": "Enkeltnivåsøk (søker kun i en mappe)",
|
||||||
"Source Code": "Kildekode",
|
"Source Code": "Kildekode",
|
||||||
@@ -137,7 +137,7 @@
|
|||||||
"Syncthing is restarting.": "Syncthing starter på ny.",
|
"Syncthing is restarting.": "Syncthing starter på ny.",
|
||||||
"Syncthing is upgrading.": "Syncthing oppgraderer.",
|
"Syncthing is upgrading.": "Syncthing oppgraderer.",
|
||||||
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Syncthing ser ut til å være nede, eller så er det et problem med nettforbindelsen din. Prøver på ny …",
|
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Syncthing ser ut til å være nede, eller så er det et problem med nettforbindelsen din. Prøver på ny …",
|
||||||
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Syncthing seems to be experiencing a problem processing your request. Please reload your browser or restart Syncthing if the problem persists.",
|
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Syncthing ser ut til å ha støtt på et problem under behandling av din forespørsel. Vennligst oppfrisk nettleseren eller start Syncthing på nytt dersom problemet vedvarer.",
|
||||||
"The aggregated statistics are publicly available at {%url%}.": "Samlet statistikk er åpent tilgjengelig på {{url}}.",
|
"The aggregated statistics are publicly available at {%url%}.": "Samlet statistikk er åpent tilgjengelig på {{url}}.",
|
||||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Innstillingene har blitt lagret men ikke aktivert. Syncthing må starte på ny for å aktivere de nye innstillingene.",
|
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Innstillingene har blitt lagret men ikke aktivert. Syncthing må starte på ny for å aktivere de nye innstillingene.",
|
||||||
"The device ID cannot be blank.": "Enhets-ID kan ikke være tom.",
|
"The device ID cannot be blank.": "Enhets-ID kan ikke være tom.",
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
"Add new folder?": "Добавить новую папку?",
|
"Add new folder?": "Добавить новую папку?",
|
||||||
"Address": "Адрес",
|
"Address": "Адрес",
|
||||||
"Addresses": "Адреса",
|
"Addresses": "Адреса",
|
||||||
"All Data": "All Data",
|
"All Data": "Все данные",
|
||||||
"Allow Anonymous Usage Reporting?": "Разрешить сбор анонимной статистики использования?",
|
"Allow Anonymous Usage Reporting?": "Разрешить сбор анонимной статистики использования?",
|
||||||
"Anonymous Usage Reporting": "Анонимная статистика использования",
|
"Anonymous Usage Reporting": "Анонимная статистика использования",
|
||||||
"Any devices configured on an introducer device will be added to this device as well.": "Все устройства, подключённые к устройству-рекомендателю, будут добавлены к текущему устройству.",
|
"Any devices configured on an introducer device will be added to this device as well.": "Все устройства, подключённые к устройству-рекомендателю, будут добавлены к текущему устройству.",
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
"Changelog": "Журнал изменений",
|
"Changelog": "Журнал изменений",
|
||||||
"Close": "Закрыть",
|
"Close": "Закрыть",
|
||||||
"Comment, when used at the start of a line": "Комментарий, если используется в начале строки",
|
"Comment, when used at the start of a line": "Комментарий, если используется в начале строки",
|
||||||
"Compression": "Compression",
|
"Compression": "Сжатие",
|
||||||
"Compression is recommended in most setups.": "Сжатие рекомендуется в большинстве случаев.",
|
"Compression is recommended in most setups.": "Сжатие рекомендуется в большинстве случаев.",
|
||||||
"Connection Error": "Ошибка подключения",
|
"Connection Error": "Ошибка подключения",
|
||||||
"Copied from elsewhere": "Скопировано из другого места",
|
"Copied from elsewhere": "Скопировано из другого места",
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
"Local Discovery": "Локальное обнаружение",
|
"Local Discovery": "Локальное обнаружение",
|
||||||
"Local State": "Локальное состояние",
|
"Local State": "Локальное состояние",
|
||||||
"Maximum Age": "Максимальный срок",
|
"Maximum Age": "Максимальный срок",
|
||||||
"Metadata Only": "Metadata Only",
|
"Metadata Only": "Только метаданные",
|
||||||
"Move to top of queue": "Поместить в начало очереди",
|
"Move to top of queue": "Поместить в начало очереди",
|
||||||
"Multi level wildcard (matches multiple directory levels)": "Многоуровневая маска (поиск совпадений во всех подпапках)",
|
"Multi level wildcard (matches multiple directory levels)": "Многоуровневая маска (поиск совпадений во всех подпапках)",
|
||||||
"Never": "Никогда",
|
"Never": "Никогда",
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
"No File Versioning": "Без управления версиями файлов",
|
"No File Versioning": "Без управления версиями файлов",
|
||||||
"Notice": "Внимание",
|
"Notice": "Внимание",
|
||||||
"OK": "ОК",
|
"OK": "ОК",
|
||||||
"Off": "Off",
|
"Off": "Отключить",
|
||||||
"Offline": "Оффлайн",
|
"Offline": "Оффлайн",
|
||||||
"Online": "Онлайн",
|
"Online": "Онлайн",
|
||||||
"Out Of Sync": "Не синхронизировано",
|
"Out Of Sync": "Не синхронизировано",
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
"All Data": "Усі дані",
|
"All Data": "Усі дані",
|
||||||
"Allow Anonymous Usage Reporting?": "Дозволити програмі збирати анонімну статистику використання?",
|
"Allow Anonymous Usage Reporting?": "Дозволити програмі збирати анонімну статистику використання?",
|
||||||
"Anonymous Usage Reporting": "Анонімна статистика використання",
|
"Anonymous Usage Reporting": "Анонімна статистика використання",
|
||||||
"Any devices configured on an introducer device will be added to this device as well.": "Усі пристрої, налаштовані на пристрої-інтродукторі, будуть додані до поточного пристрою.",
|
"Any devices configured on an introducer device will be added to this device as well.": "Усі пристрої, налаштовані на пристрої-рекомендувачі, будуть додані до поточного пристрою.",
|
||||||
"Automatic upgrades": "Автоматичні оновлення",
|
"Automatic upgrades": "Автоматичні оновлення",
|
||||||
"Bugs": "Помилки",
|
"Bugs": "Помилки",
|
||||||
"CPU Utilization": "Навантаження CPU",
|
"CPU Utilization": "Навантаження CPU",
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
"Ignore Patterns": "Ігнорувати шаблони",
|
"Ignore Patterns": "Ігнорувати шаблони",
|
||||||
"Ignore Permissions": "Ігнорувати права доступу до файлів",
|
"Ignore Permissions": "Ігнорувати права доступу до файлів",
|
||||||
"Incoming Rate Limit (KiB/s)": "Ліміт швидкості завантаження (КіБ/с)",
|
"Incoming Rate Limit (KiB/s)": "Ліміт швидкості завантаження (КіБ/с)",
|
||||||
"Introducer": "Інтродуктор",
|
"Introducer": "Рекомендувач",
|
||||||
"Inversion of the given condition (i.e. do not exclude)": "Інверсія поточної умови (тобто не виключає)",
|
"Inversion of the given condition (i.e. do not exclude)": "Інверсія поточної умови (тобто не виключає)",
|
||||||
"Keep Versions": "Зберігати версії",
|
"Keep Versions": "Зберігати версії",
|
||||||
"Last File Received": "Останній завантажений файл",
|
"Last File Received": "Останній завантажений файл",
|
||||||
|
|||||||
@@ -24,10 +24,10 @@
|
|||||||
"Copied from original": "从源复制",
|
"Copied from original": "从源复制",
|
||||||
"Copyright © 2014 Jakob Borg and the following Contributors:": "版权© 2014 Jakob Borg 及以下贡献者:",
|
"Copyright © 2014 Jakob Borg and the following Contributors:": "版权© 2014 Jakob Borg 及以下贡献者:",
|
||||||
"Delete": "删除",
|
"Delete": "删除",
|
||||||
"Device ID": "设备ID",
|
"Device ID": "设备标识",
|
||||||
"Device Identification": "设备ID",
|
"Device Identification": "设备标识",
|
||||||
"Device Name": "设备名",
|
"Device Name": "设备名",
|
||||||
"Device {%device%} ({%address%}) wants to connect. Add new device?": "设备 {{device}} ({{address}}) 请求连接。是否添加新设备?",
|
"Device {%device%} ({%address%}) wants to connect. Add new device?": "设备:{{device}} 地址:({{address}}) 请求连接。是否添加新设备?",
|
||||||
"Devices": "设备",
|
"Devices": "设备",
|
||||||
"Disconnected": "连接已断开",
|
"Disconnected": "连接已断开",
|
||||||
"Documentation": "文档",
|
"Documentation": "文档",
|
||||||
@@ -35,19 +35,19 @@
|
|||||||
"Downloaded": "已下载",
|
"Downloaded": "已下载",
|
||||||
"Downloading": "下载中",
|
"Downloading": "下载中",
|
||||||
"Edit": "选项",
|
"Edit": "选项",
|
||||||
"Edit Device": "修改设备选项",
|
"Edit Device": "编辑设备选项",
|
||||||
"Edit Folder": "修改文件夹选项",
|
"Edit Folder": "编辑文件夹选项",
|
||||||
"Editing": "正在编辑",
|
"Editing": "正在编辑",
|
||||||
"Enable UPnP": "开启UPnP",
|
"Enable UPnP": "开启UPnP",
|
||||||
"Enter comma separated \"ip:port\" addresses or \"dynamic\" to perform automatic discovery of the address.": "输入以半角逗号分隔的\"ip:端口\"设置可用地址列表,或者输入\"dynamic\"表示自动寻找地址。",
|
"Enter comma separated \"ip:port\" addresses or \"dynamic\" to perform automatic discovery of the address.": "输入以半角逗号分隔的\"ip:端口\"设置可用地址列表,或者输入\"dynamic\"表示自动寻找地址。",
|
||||||
"Enter ignore patterns, one per line.": "请输入忽略表达式,每行一个",
|
"Enter ignore patterns, one per line.": "请输入忽略表达式,每行一条",
|
||||||
"Error": "错误",
|
"Error": "错误",
|
||||||
"File Versioning": "版本控制",
|
"File Versioning": "版本控制",
|
||||||
"File permission bits are ignored when looking for changes. Use on FAT filesystems.": "监控文件改变时,忽略文件权限位。用于FAT文件系统。",
|
"File permission bits are ignored when looking for changes. Use on FAT filesystems.": "监控文件改变时,忽略文件权限位。用于FAT文件系统。",
|
||||||
"Files are moved to date stamped versions in a .stversions folder when replaced or deleted by syncthing.": "当文件被syncthing修改或者删除时,将会被移动到.stversions文件夹已保留历史版本。",
|
"Files are moved to date stamped versions in a .stversions folder when replaced or deleted by syncthing.": "当文件被syncthing修改或者删除时,将会被移动到.stversions文件夹已保留历史版本。",
|
||||||
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "在其它设备上对该文件夹内文件的修改并不会被同步到本机,但是在本机上对该文件夹内文件的修改,将会被同步到其它设备。",
|
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "在其它设备中对该文件夹内文件的修改并不会被同步到本机,但是在本机上对其的修改,则会被同步到其它设备中。",
|
||||||
"Folder ID": "文件夹ID",
|
"Folder ID": "文件夹标识",
|
||||||
"Folder Master": "母文件夹",
|
"Folder Master": "主文件夹",
|
||||||
"Folder Path": "文件夹路径",
|
"Folder Path": "文件夹路径",
|
||||||
"Folders": "文件夹",
|
"Folders": "文件夹",
|
||||||
"GUI Authentication Password": "登陆web管理页面的密码",
|
"GUI Authentication Password": "登陆web管理页面的密码",
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
"Ignore": "忽略",
|
"Ignore": "忽略",
|
||||||
"Ignore Patterns": "忽略列表",
|
"Ignore Patterns": "忽略列表",
|
||||||
"Ignore Permissions": "忽略文件权限",
|
"Ignore Permissions": "忽略文件权限",
|
||||||
"Incoming Rate Limit (KiB/s)": "下载速率限制(千字节/秒)",
|
"Incoming Rate Limit (KiB/s)": "下载速率限制(KiB/s)",
|
||||||
"Introducer": "介绍人节点",
|
"Introducer": "介绍人节点",
|
||||||
"Inversion of the given condition (i.e. do not exclude)": "对本条件取反(例如:不要排除某项)",
|
"Inversion of the given condition (i.e. do not exclude)": "对本条件取反(例如:不要排除某项)",
|
||||||
"Keep Versions": "保留历史版本数量",
|
"Keep Versions": "保留历史版本数量",
|
||||||
@@ -91,7 +91,7 @@
|
|||||||
"Outgoing Rate Limit (KiB/s)": "上传速度限制(千字节/秒)",
|
"Outgoing Rate Limit (KiB/s)": "上传速度限制(千字节/秒)",
|
||||||
"Override Changes": "撤销改变",
|
"Override Changes": "撤销改变",
|
||||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "文件夹在本地的路径。如果不存在,则会被创建。波浪线符号(~)是如下路径的缩略符:",
|
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "文件夹在本地的路径。如果不存在,则会被创建。波浪线符号(~)是如下路径的缩略符:",
|
||||||
"Path where versions should be stored (leave empty for the default .stversions folder in the folder).": "用来存储历史版本的文件夹(留空则将会存储在默认的.stversions文件夹)",
|
"Path where versions should be stored (leave empty for the default .stversions folder in the folder).": "用来存储历史版本的文件夹(留空则将默认会存储在.stversions文件夹中)",
|
||||||
"Please wait": "请稍候",
|
"Please wait": "请稍候",
|
||||||
"Preview": "预览",
|
"Preview": "预览",
|
||||||
"Preview Usage Report": "预览使用报告",
|
"Preview Usage Report": "预览使用报告",
|
||||||
@@ -117,8 +117,8 @@
|
|||||||
"Shared With": "共享给",
|
"Shared With": "共享给",
|
||||||
"Short identifier for the folder. Must be the same on all cluster devices.": "文件夹的别名。必须在所有设备上保持一致。",
|
"Short identifier for the folder. Must be the same on all cluster devices.": "文件夹的别名。必须在所有设备上保持一致。",
|
||||||
"Show ID": "显示设备ID",
|
"Show ID": "显示设备ID",
|
||||||
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "在设备丛中,显示该名称,而不是设备ID。亦会作为一个可选的默认名称被发送到其他设备。",
|
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "在设备丛中,显示该名称,而不是设备标识。亦会作为一个可选的默认名称被发送到其他设备。",
|
||||||
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "在设备丛中,将会显示本名称,而不是设备ID。如果设置为空,则会使用目标设备提供的默认名称。",
|
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "在设备丛中,将会显示本名称,而不是设备标识。如果设置为空,则会使用目标设备提供的默认名称。",
|
||||||
"Shutdown": "关闭Syncthing",
|
"Shutdown": "关闭Syncthing",
|
||||||
"Shutdown Complete": "关闭完成",
|
"Shutdown Complete": "关闭完成",
|
||||||
"Simple File Versioning": "简易版本控制",
|
"Simple File Versioning": "简易版本控制",
|
||||||
@@ -140,14 +140,14 @@
|
|||||||
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Syncthing 在处理您的请求时似乎碰到了问题。如果问题持续,请刷新您的浏览器或重启 Syncthing 。",
|
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Syncthing 在处理您的请求时似乎碰到了问题。如果问题持续,请刷新您的浏览器或重启 Syncthing 。",
|
||||||
"The aggregated statistics are publicly available at {%url%}.": "全局统计公布于 {{url}}",
|
"The aggregated statistics are publicly available at {%url%}.": "全局统计公布于 {{url}}",
|
||||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "设置已经保存,但是还未生效。Syncthing需要重启以启用新的设置。",
|
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "设置已经保存,但是还未生效。Syncthing需要重启以启用新的设置。",
|
||||||
"The device ID cannot be blank.": "设备ID不能为空",
|
"The device ID cannot be blank.": "设备标识不能为空",
|
||||||
"The device ID to enter here can be found in the \"Edit > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "在这里所需要输入的设备ID,可以在目标设备的“选项->显示设备ID\"中看到。空格和横线可选(将会被忽略)。",
|
"The device ID to enter here can be found in the \"Edit > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "在这里所需要输入的设备标识,可以在目标设备的“选项->显示设备标识”中看到。空格和横线可选(将会被忽略)。",
|
||||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "经过加密的使用报告会每天发送。它用来跟踪统计使用本软件的平台,文件夹大小,以及本软件的版本。如果报告的内容有任何变化,本对话框会再次弹出提示您。",
|
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "经过加密的使用报告会每天发送。它用来跟踪统计使用本软件的平台,文件夹大小,以及本软件的版本。如果报告的内容有任何变化,本对话框会再次弹出提示您。",
|
||||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "输入的设备ID似乎无效。设备ID长度必须为52或56的字母和数字。空格和横线不算在内。",
|
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "输入的设备标识似乎无效。设备标识长度必须为52或56的字母和数字,空格和横线不算在内。",
|
||||||
"The folder ID cannot be blank.": "文件夹ID不能为空。",
|
"The folder ID cannot be blank.": "文件夹标识不能为空。",
|
||||||
"The folder ID must be a short identifier (64 characters or less) consisting of letters, numbers and the dot (.), dash (-) and underscode (_) characters only.": "文件夹ID至多为64字节,且仅能包含字母,数字,半角句号(.),横线(-),下划线(_)。",
|
"The folder ID must be a short identifier (64 characters or less) consisting of letters, numbers and the dot (.), dash (-) and underscode (_) characters only.": "文件夹标识必须由不长于 64 位字符,且仅能包含字母、数字、半角句号(.)、横线(-)和下划线(_)。",
|
||||||
"The folder ID must be unique.": "文件夹ID必须唯一。",
|
"The folder ID must be unique.": "文件夹标识不得重复",
|
||||||
"The folder path cannot be blank.": "文件夹路径不能为空。",
|
"The folder path cannot be blank.": "文件夹路径不能为空",
|
||||||
"The following intervals are used: for the first hour a version is kept every 30 seconds, for the first day a version is kept every hour, for the first 30 days a version is kept every day, until the maximum age a version is kept every week.": "保留的历史版本会满足以下条件:最近一小时内的历史版本,更新间隔小于30秒的仅保留一份。最近一天内的历史版本,更新间隔小于1小时的仅保留一份。最近一个月内的历史版本,更新间隔小于1天的仅保留一份。距离现在超过一个月且小于最长保留时间的,更新间隔小于1周的仅保留一份。",
|
"The following intervals are used: for the first hour a version is kept every 30 seconds, for the first day a version is kept every hour, for the first 30 days a version is kept every day, until the maximum age a version is kept every week.": "保留的历史版本会满足以下条件:最近一小时内的历史版本,更新间隔小于30秒的仅保留一份。最近一天内的历史版本,更新间隔小于1小时的仅保留一份。最近一个月内的历史版本,更新间隔小于1天的仅保留一份。距离现在超过一个月且小于最长保留时间的,更新间隔小于1周的仅保留一份。",
|
||||||
"The maximum age must be a number and cannot be blank.": "最长保留时间必须为数字,且不能为空。",
|
"The maximum age must be a number and cannot be blank.": "最长保留时间必须为数字,且不能为空。",
|
||||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "历史版本保留的最长天数,0为永久保存",
|
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "历史版本保留的最长天数,0为永久保存",
|
||||||
@@ -168,10 +168,10 @@
|
|||||||
"Versions Path": "历史版本路径",
|
"Versions Path": "历史版本路径",
|
||||||
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "超过最长保留时间,或者不满足下列条件的历史版本,将会被删除。",
|
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "超过最长保留时间,或者不满足下列条件的历史版本,将会被删除。",
|
||||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "若您在本机添加新设备,记住您也必须在这个设备上添加本机。",
|
"When adding a new device, keep in mind that this device must be added on the other side too.": "若您在本机添加新设备,记住您也必须在这个设备上添加本机。",
|
||||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "若你添加了新文件夹,记住文件夹ID是用以在不同设备间建立联系的。在不同设备间拥有相同ID的文件夹将会被同步。且文件夹ID大小写敏感。",
|
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "若你添加了新文件夹,记住文件夹标识是用以在不同设备间建立联系的。在不同设备间拥有相同标识的文件夹将会被同步。且文件夹标识大小写敏感。",
|
||||||
"Yes": "是",
|
"Yes": "是",
|
||||||
"You must keep at least one version.": "您必须保留至少一个版本。",
|
"You must keep at least one version.": "您必须保留至少一个版本。",
|
||||||
"full documentation": "完整文档",
|
"full documentation": "完整文档",
|
||||||
"items": "条目",
|
"items": "条目",
|
||||||
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} 想将文件夹 \"{{folder}}\" 共享给您。"
|
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} 想将 “{{folder}}” 文件夹共享给您"
|
||||||
}
|
}
|
||||||
+116
-108
@@ -2,18 +2,10 @@
|
|||||||
<!--
|
<!--
|
||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
-->
|
-->
|
||||||
<html lang="en" ng-app="syncthing" ng-controller="SyncthingController" class="ng-cloak">
|
<html lang="en" ng-app="syncthing" ng-controller="SyncthingController" class="ng-cloak">
|
||||||
<head>
|
<head>
|
||||||
@@ -37,7 +29,7 @@
|
|||||||
|
|
||||||
<nav class="navbar navbar-top navbar-default" role="navigation">
|
<nav class="navbar navbar-top navbar-default" role="navigation">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<span class="navbar-brand"><img class="logo" src="assets/img/logo-text-64.png" height="32" width="117"/></span>
|
<span class="navbar-brand"><img class="logo" src="assets/img/logo-horizontal.svg" height="32" width="117"/></span>
|
||||||
<p class="navbar-text hidden-xs">{{thisDeviceName()}}</p>
|
<p class="navbar-text hidden-xs">{{thisDeviceName()}}</p>
|
||||||
<ul class="nav navbar-nav navbar-right">
|
<ul class="nav navbar-nav navbar-right">
|
||||||
<li ng-if="upgradeInfo && upgradeInfo.newer">
|
<li ng-if="upgradeInfo && upgradeInfo.newer">
|
||||||
@@ -155,7 +147,7 @@
|
|||||||
<div class="panel panel-warning">
|
<div class="panel panel-warning">
|
||||||
<div class="panel-heading"><h3 class="panel-title"><span class="glyphicon glyphicon-exclamation-sign"></span><span translate>Notice</span></h3></div>
|
<div class="panel-heading"><h3 class="panel-title"><span class="glyphicon glyphicon-exclamation-sign"></span><span translate>Notice</span></h3></div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<p ng-repeat="err in errorList()"><small>{{err.Time | date:"H:mm:ss"}}:</small> {{friendlyDevices(err.Error)}}</p>
|
<p ng-repeat="err in errorList()"><small>{{err.time | date:"H:mm:ss"}}:</small> {{friendlyDevices(err.error)}}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-footer">
|
<div class="panel-footer">
|
||||||
<button type="button" class="pull-right btn btn-sm btn-default" ng-click="clearErrors()"><span class="glyphicon glyphicon-ok"></span> <span translate>OK</span></button>
|
<button type="button" class="pull-right btn btn-sm btn-default" ng-click="clearErrors()"><span class="glyphicon glyphicon-ok"></span> <span translate>OK</span></button>
|
||||||
@@ -176,9 +168,9 @@
|
|||||||
<div class="visible-xs"><h3><span translate>Folders</span></h3><hr></div>
|
<div class="visible-xs"><h3><span translate>Folders</span></h3><hr></div>
|
||||||
<div class="panel panel-default" ng-repeat="folder in folderList()">
|
<div class="panel panel-default" ng-repeat="folder in folderList()">
|
||||||
<div class="panel-heading" data-toggle="collapse" data-parent="#folders" href="#folder-{{$index}}" style="cursor: pointer">
|
<div class="panel-heading" data-toggle="collapse" data-parent="#folders" href="#folder-{{$index}}" style="cursor: pointer">
|
||||||
<div class="panel-progress" ng-show="folderStatus(folder) == 'syncing'" ng-attr-style="width: {{syncPercentage(folder.ID)}}%"></div>
|
<div class="panel-progress" ng-show="folderStatus(folder) == 'syncing'" ng-attr-style="width: {{syncPercentage(folder.id)}}%"></div>
|
||||||
<h3 class="panel-title">
|
<h3 class="panel-title">
|
||||||
<span class="glyphicon glyphicon-hdd hidden-xs"></span>{{folder.ID}}
|
<span class="glyphicon glyphicon-hdd hidden-xs"></span>{{folder.id}}
|
||||||
<span class="pull-right text-{{folderClass(folder)}}" ng-switch="folderStatus(folder)">
|
<span class="pull-right text-{{folderClass(folder)}}" ng-switch="folderStatus(folder)">
|
||||||
<span ng-switch-when="unknown"><span class="hidden-xs" translate>Unknown</span><span class="visible-xs">◼</span></span>
|
<span ng-switch-when="unknown"><span class="hidden-xs" translate>Unknown</span><span class="visible-xs">◼</span></span>
|
||||||
<span ng-switch-when="unshared"><span class="hidden-xs" translate>Unshared</span><span class="visible-xs">◼</span></span>
|
<span ng-switch-when="unshared"><span class="hidden-xs" translate>Unshared</span><span class="visible-xs">◼</span></span>
|
||||||
@@ -187,7 +179,7 @@
|
|||||||
<span ng-switch-when="idle"><span class="hidden-xs" translate>Up to Date</span><span class="visible-xs">◼</span></span>
|
<span ng-switch-when="idle"><span class="hidden-xs" translate>Up to Date</span><span class="visible-xs">◼</span></span>
|
||||||
<span ng-switch-when="syncing">
|
<span ng-switch-when="syncing">
|
||||||
<span class="hidden-xs" translate>Syncing</span>
|
<span class="hidden-xs" translate>Syncing</span>
|
||||||
({{syncPercentage(folder.ID)}}%)
|
({{syncPercentage(folder.id)}}%)
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</h3>
|
</h3>
|
||||||
@@ -198,64 +190,65 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th><span class="glyphicon glyphicon-folder-open"></span> <span translate>Folder Path</span></th>
|
<th><span class="glyphicon glyphicon-folder-open"></span> <span translate>Folder Path</span></th>
|
||||||
<td class="text-right">{{folder.Path}}</td>
|
<td class="text-right">{{folder.path}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-if="model[folder.ID].invalid">
|
<tr ng-if="model[folder.id].invalid">
|
||||||
<th><span class="glyphicon glyphicon-warning-sign"></span> <span translate>Error</span></th>
|
<th><span class="glyphicon glyphicon-warning-sign"></span> <span translate>Error</span></th>
|
||||||
<td class="text-right">{{model[folder.ID].invalid}}</td>
|
<td class="text-right">{{model[folder.id].invalid}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th><span class="glyphicon glyphicon-globe"></span> <span translate>Global State</span></th>
|
<th><span class="glyphicon glyphicon-globe"></span> <span translate>Global State</span></th>
|
||||||
<td class="text-right">{{model[folder.ID].globalFiles | alwaysNumber}} <span translate>items</span>, ~{{model[folder.ID].globalBytes | binary}}B</td>
|
<td class="text-right">{{model[folder.id].globalFiles | alwaysNumber}} <span translate>items</span>, ~{{model[folder.id].globalBytes | binary}}B</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th><span class="glyphicon glyphicon-home"></span> <span translate>Local State</span></th>
|
<th><span class="glyphicon glyphicon-home"></span> <span translate>Local State</span></th>
|
||||||
<td class="text-right">{{model[folder.ID].localFiles | alwaysNumber}} <span translate>items</span>, ~{{model[folder.ID].localBytes | binary}}B</td>
|
<td class="text-right">{{model[folder.id].localFiles | alwaysNumber}} <span translate>items</span>, ~{{model[folder.id].localBytes | binary}}B</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-if="model[folder.ID].needFiles > 0">
|
<tr ng-if="model[folder.id].needFiles > 0">
|
||||||
<th><span class="glyphicon glyphicon-cloud-download"></span> <span translate>Out Of Sync</span></th>
|
<th><span class="glyphicon glyphicon-cloud-download"></span> <span translate>Out Of Sync</span></th>
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
<a ng-click="showNeed(folder.ID)" href="">{{model[folder.ID].needFiles | alwaysNumber}} <span translate>items</span>, ~{{model[folder.ID].needBytes | binary}}B</a>
|
<a ng-click="showNeed(folder.id)" href="">{{model[folder.id].needFiles | alwaysNumber}} <span translate>items</span>, ~{{model[folder.id].needBytes | binary}}B</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-if="folder.ReadOnly">
|
<tr ng-if="folder.readOnly">
|
||||||
<th><span class="glyphicon glyphicon-lock"></span> <span translate>Folder Master</span></th>
|
<th><span class="glyphicon glyphicon-lock"></span> <span translate>Folder Master</span></th>
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
<span translate>Yes</span>
|
<span translate>Yes</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-if="model[folder.ID].ignorePatterns">
|
<tr ng-if="model[folder.id].ignorePatterns">
|
||||||
<th><span class="glyphicon glyphicon-eye-close"></span> <span translate>Ignore Patterns</span></th>
|
<th><span class="glyphicon glyphicon-eye-close"></span> <span translate>Ignore Patterns</span></th>
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
<span translate>Yes</span>
|
<span translate>Yes</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-if="folder.IgnorePerms">
|
<tr ng-if="folder.ignorePerms">
|
||||||
<th><span class="glyphicon glyphicon-unchecked"></span> <span translate>Ignore Permissions</span></th>
|
<th><span class="glyphicon glyphicon-unchecked"></span> <span translate>Ignore Permissions</span></th>
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
<span translate>Yes</span>
|
<span translate>Yes</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-if="folder.RescanIntervalS != 60">
|
<tr ng-if="folder.rescanIntervalS != 60">
|
||||||
<th><span class="glyphicon glyphicon-refresh"></span> <span translate>Rescan Interval</span></th>
|
<th><span class="glyphicon glyphicon-refresh"></span> <span translate>Rescan Interval</span></th>
|
||||||
<td class="text-right">{{folder.RescanIntervalS}} s</td>
|
<td class="text-right">{{folder.rescanIntervalS}} s</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-if="folder.Versioning.Type">
|
<tr ng-if="folder.versioning.type">
|
||||||
<th><span class="glyphicon glyphicon-tags"></span> <span translate>File Versioning</span></th>
|
<th><span class="glyphicon glyphicon-tags"></span> <span translate>File Versioning</span></th>
|
||||||
<td class="text-right" ng-switch="folder.Versioning.Type">
|
<td class="text-right" ng-switch="folder.versioning.type">
|
||||||
<span ng-switch-when="staggered" translate>Staggered File Versioning</span>
|
<span ng-switch-when="staggered" translate>Staggered File Versioning</span>
|
||||||
<span ng-switch-when="simple" translate>Simple File Versioning</span>
|
<span ng-switch-when="simple" translate>Simple File Versioning</span>
|
||||||
|
<span ng-switch-when="external" translate>External File Versioning</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th><span class="glyphicon glyphicon-share-alt"></span> <span translate>Shared With</span></th>
|
<th><span class="glyphicon glyphicon-share-alt"></span> <span translate>Shared With</span></th>
|
||||||
<td class="text-right">{{sharesFolder(folder)}}</td>
|
<td class="text-right">{{sharesFolder(folder)}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-if="folderStats[folder.ID].LastFile">
|
<tr ng-if="!folder.readOnly && folderStats[folder.id].lastFile">
|
||||||
<th><span class="glyphicon glyphicon-transfer"></span> <span translate>Last File Received</span></th>
|
<th><span class="glyphicon glyphicon-transfer"></span> <span translate>Last File Received</span></th>
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
<span title="{{folderStats[folder.ID].LastFile.Filename}} @ {{folderStats[folder.ID].LastFile.At | date:'yyyy-MM-dd HH:mm'}}">
|
<span title="{{folderStats[folder.id].lastFile.filename}} @ {{folderStats[folder.id].lastFile.at | date:'yyyy-MM-dd HH:mm'}}">
|
||||||
{{folderStats[folder.ID].LastFile.Filename | basename}}
|
{{folderStats[folder.id].lastFile.filename | basename}}
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -263,9 +256,9 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-footer">
|
<div class="panel-footer">
|
||||||
<button class="btn btn-sm btn-danger pull-left" ng-if="folder.ReadOnly && model[folder.ID].needFiles > 0" ng-click="override(folder.ID)" href=""><span class="glyphicon glyphicon-upload"></span> <span translate>Override Changes</span></button>
|
<button class="btn btn-sm btn-danger pull-left" ng-if="folder.readOnly && model[folder.id].needFiles > 0" ng-click="override(folder.id)" href=""><span class="glyphicon glyphicon-upload"></span> <span translate>Override Changes</span></button>
|
||||||
<span class="pull-right">
|
<span class="pull-right">
|
||||||
<button class="btn btn-sm btn-default" href="" ng-show="folderStatus(folder) == 'idle'" ng-click="rescanFolder(folder.ID)"><span class="glyphicon glyphicon-refresh"></span> <span translate>Rescan</span></button>
|
<button class="btn btn-sm btn-default" href="" ng-show="folderStatus(folder) == 'idle'" ng-click="rescanFolder(folder.id)"><span class="glyphicon glyphicon-refresh"></span> <span translate>Rescan</span></button>
|
||||||
<button class="btn btn-sm btn-default" href="" ng-click="editFolder(folder)"><span class="glyphicon glyphicon-pencil"></span> <span translate>Edit</span></button>
|
<button class="btn btn-sm btn-default" href="" ng-click="editFolder(folder)"><span class="glyphicon glyphicon-pencil"></span> <span translate>Edit</span></button>
|
||||||
</span>
|
</span>
|
||||||
<div class="clearfix"></div>
|
<div class="clearfix"></div>
|
||||||
@@ -290,7 +283,7 @@
|
|||||||
<div class="panel panel-default" ng-repeat="deviceCfg in [thisDevice()]">
|
<div class="panel panel-default" ng-repeat="deviceCfg in [thisDevice()]">
|
||||||
<div class="panel-heading" data-toggle="collapse" href="#device-this" style="cursor: pointer">
|
<div class="panel-heading" data-toggle="collapse" href="#device-this" style="cursor: pointer">
|
||||||
<h3 class="panel-title">
|
<h3 class="panel-title">
|
||||||
<identicon data-value="deviceCfg.DeviceID"></identicon> {{deviceName(deviceCfg)}}
|
<identicon data-value="deviceCfg.deviceID"></identicon> {{deviceName(deviceCfg)}}
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<div id="device-this" class="panel-collapse collapse in">
|
<div id="device-this" class="panel-collapse collapse in">
|
||||||
@@ -299,11 +292,11 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th><span class="glyphicon glyphicon-cloud-download"></span> <span translate>Download Rate</span></th>
|
<th><span class="glyphicon glyphicon-cloud-download"></span> <span translate>Download Rate</span></th>
|
||||||
<td class="text-right">{{connections['total'].inbps | binary}}B/s ({{connections['total'].InBytesTotal | binary}}B)</td>
|
<td class="text-right">{{connections['total'].inbps | binary}}B/s ({{connections['total'].inBytesTotal | binary}}B)</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th><span class="glyphicon glyphicon-cloud-upload"></span> <span translate>Upload Rate</span></th>
|
<th><span class="glyphicon glyphicon-cloud-upload"></span> <span translate>Upload Rate</span></th>
|
||||||
<td class="text-right">{{connections['total'].outbps | binary}}B/s ({{connections['total'].OutBytesTotal | binary}}B)</td>
|
<td class="text-right">{{connections['total'].outbps | binary}}B/s ({{connections['total'].outBytesTotal | binary}}B)</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th><span class="glyphicon glyphicon-th"></span> <span translate>RAM Utilization</span></th>
|
<th><span class="glyphicon glyphicon-th"></span> <span translate>RAM Utilization</span></th>
|
||||||
@@ -341,13 +334,13 @@
|
|||||||
<div class="panel-group" id="devices">
|
<div class="panel-group" id="devices">
|
||||||
<div class="panel panel-default" ng-repeat="deviceCfg in otherDevices()">
|
<div class="panel panel-default" ng-repeat="deviceCfg in otherDevices()">
|
||||||
<div class="panel-heading" data-toggle="collapse" data-parent="#devices" href="#device-{{$index}}" style="cursor: pointer">
|
<div class="panel-heading" data-toggle="collapse" data-parent="#devices" href="#device-{{$index}}" style="cursor: pointer">
|
||||||
<div class="panel-progress" ng-show="deviceStatus(deviceCfg) == 'syncing'" ng-attr-style="width: {{completion[deviceCfg.DeviceID]._total | number:0}}%"></div>
|
<div class="panel-progress" ng-show="deviceStatus(deviceCfg) == 'syncing'" ng-attr-style="width: {{completion[deviceCfg.deviceID]._total | number:0}}%"></div>
|
||||||
<h3 class="panel-title">
|
<h3 class="panel-title">
|
||||||
<identicon data-value="deviceCfg.DeviceID"></identicon> {{deviceName(deviceCfg)}}
|
<identicon data-value="deviceCfg.deviceID"></identicon> {{deviceName(deviceCfg)}}
|
||||||
<span ng-switch="deviceStatus(deviceCfg)" class="pull-right text-{{deviceClass(deviceCfg)}}">
|
<span ng-switch="deviceStatus(deviceCfg)" class="pull-right text-{{deviceClass(deviceCfg)}}">
|
||||||
<span ng-switch-when="insync"><span class="hidden-xs" translate>Up to Date</span><span class="visible-xs">◼</span></span>
|
<span ng-switch-when="insync"><span class="hidden-xs" translate>Up to Date</span><span class="visible-xs">◼</span></span>
|
||||||
<span ng-switch-when="syncing">
|
<span ng-switch-when="syncing">
|
||||||
<span class="hidden-xs" translate>Syncing</span> ({{completion[deviceCfg.DeviceID]._total | number:0}}%)
|
<span class="hidden-xs" translate>Syncing</span> ({{completion[deviceCfg.deviceID]._total | number:0}}%)
|
||||||
</span>
|
</span>
|
||||||
<span ng-switch-when="disconnected"><span class="hidden-xs" translate>Disconnected</span><span class="visible-xs">◼</span></span>
|
<span ng-switch-when="disconnected"><span class="hidden-xs" translate>Disconnected</span><span class="visible-xs">◼</span></span>
|
||||||
<span ng-switch-when="unused"><span class="hidden-xs" translate>Unused</span><span class="visible-xs">◼</span></span>
|
<span ng-switch-when="unused"><span class="hidden-xs" translate>Unused</span><span class="visible-xs">◼</span></span>
|
||||||
@@ -358,37 +351,37 @@
|
|||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<table class="table table-condensed table-striped">
|
<table class="table table-condensed table-striped">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-if="connections[deviceCfg.DeviceID]">
|
<tr ng-if="connections[deviceCfg.deviceID]">
|
||||||
<th><span class="glyphicon glyphicon-cloud-download"></span> <span translate>Download Rate</span></th>
|
<th><span class="glyphicon glyphicon-cloud-download"></span> <span translate>Download Rate</span></th>
|
||||||
<td class="text-right">{{connections[deviceCfg.DeviceID].inbps | binary}}B/s ({{connections[deviceCfg.DeviceID].InBytesTotal | binary}}B)</td>
|
<td class="text-right">{{connections[deviceCfg.deviceID].inbps | binary}}B/s ({{connections[deviceCfg.deviceID].inBytesTotal | binary}}B)</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-if="connections[deviceCfg.DeviceID]">
|
<tr ng-if="connections[deviceCfg.deviceID]">
|
||||||
<th><span class="glyphicon glyphicon-cloud-upload"></span> <span translate>Upload Rate</span></th>
|
<th><span class="glyphicon glyphicon-cloud-upload"></span> <span translate>Upload Rate</span></th>
|
||||||
<td class="text-right">{{connections[deviceCfg.DeviceID].outbps | binary}}B/s ({{connections[deviceCfg.DeviceID].OutBytesTotal | binary}}B)</td>
|
<td class="text-right">{{connections[deviceCfg.deviceID].outbps | binary}}B/s ({{connections[deviceCfg.deviceID].outBytesTotal | binary}}B)</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th><span class="glyphicon glyphicon-link"></span> <span translate>Address</span></th>
|
<th><span class="glyphicon glyphicon-link"></span> <span translate>Address</span></th>
|
||||||
<td class="text-right">{{deviceAddr(deviceCfg)}}</td>
|
<td class="text-right">{{deviceAddr(deviceCfg)}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-if="deviceCfg.Compression != 'metadata'">
|
<tr ng-if="deviceCfg.compression != 'metadata'">
|
||||||
<th><span class="glyphicon glyphicon-compressed"></span> <span translate>Compression</span></th>
|
<th><span class="glyphicon glyphicon-compressed"></span> <span translate>Compression</span></th>
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
<span ng-if="deviceCfg.Compression == 'always'" translate>All Data</span>
|
<span ng-if="deviceCfg.compression == 'always'" translate>All Data</span>
|
||||||
<span ng-if="deviceCfg.Compression == 'never'" translate>Off</span>
|
<span ng-if="deviceCfg.compression == 'never'" translate>Off</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-if="deviceCfg.Introducer">
|
<tr ng-if="deviceCfg.introducer">
|
||||||
<th><span class="glyphicon glyphicon-thumbs-up"></span> <span translate>Introducer</span></th>
|
<th><span class="glyphicon glyphicon-thumbs-up"></span> <span translate>Introducer</span></th>
|
||||||
<td translate class="text-right">Yes</td>
|
<td translate class="text-right">Yes</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-if="connections[deviceCfg.DeviceID]">
|
<tr ng-if="connections[deviceCfg.deviceID]">
|
||||||
<th><span class="glyphicon glyphicon-tag"></span> <span translate>Version</span></th>
|
<th><span class="glyphicon glyphicon-tag"></span> <span translate>Version</span></th>
|
||||||
<td class="text-right">{{connections[deviceCfg.DeviceID].ClientVersion}}</td>
|
<td class="text-right">{{connections[deviceCfg.deviceID].clientVersion}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-if="!connections[deviceCfg.DeviceID]">
|
<tr ng-if="!connections[deviceCfg.deviceID]">
|
||||||
<th><span class="glyphicon glyphicon-eye-open"></span> <span translate>Last seen</span></th>
|
<th><span class="glyphicon glyphicon-eye-open"></span> <span translate>Last seen</span></th>
|
||||||
<td translate ng-if="!deviceStats[deviceCfg.DeviceID].LastSeenDays || deviceStats[deviceCfg.DeviceID].LastSeenDays >= 365" class="text-right">Never</td>
|
<td translate ng-if="!deviceStats[deviceCfg.deviceID].lastSeenDays || deviceStats[deviceCfg.deviceID].lastSeenDays >= 365" class="text-right">Never</td>
|
||||||
<td ng-if="deviceStats[deviceCfg.DeviceID].LastSeenDays < 365" class="text-right">{{deviceStats[deviceCfg.DeviceID].LastSeen | date:"yyyy-MM-dd HH:mm"}}</td>
|
<td ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays < 365" class="text-right">{{deviceStats[deviceCfg.deviceID].lastSeen | date:"yyyy-MM-dd HH:mm"}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-if="deviceFolders(deviceCfg).length > 0">
|
<tr ng-if="deviceFolders(deviceCfg).length > 0">
|
||||||
<th><span class="glyphicon glyphicon-hdd"></span> <span translate>Folders</span></th>
|
<th><span class="glyphicon glyphicon-hdd"></span> <span translate>Folders</span></th>
|
||||||
@@ -481,11 +474,11 @@
|
|||||||
<form role="form" name="deviceEditor">
|
<form role="form" name="deviceEditor">
|
||||||
<div class="form-group" ng-class="{'has-error': deviceEditor.deviceID.$invalid && deviceEditor.deviceID.$dirty}">
|
<div class="form-group" ng-class="{'has-error': deviceEditor.deviceID.$invalid && deviceEditor.deviceID.$dirty}">
|
||||||
<label translate for="deviceID">Device ID</label>
|
<label translate for="deviceID">Device ID</label>
|
||||||
<input ng-if="!editingExisting" name="deviceID" id="deviceID" class="form-control text-monospace" type="text" ng-model="currentDevice.DeviceID" required valid-deviceid list="discovery-list" />
|
<input ng-if="!editingExisting" name="deviceID" id="deviceID" class="form-control text-monospace" type="text" ng-model="currentDevice.deviceID" required valid-deviceid list="discovery-list" />
|
||||||
<datalist id="discovery-list" ng-if="!editingExisting">
|
<datalist id="discovery-list" ng-if="!editingExisting">
|
||||||
<option ng-repeat="(id,address) in discovery" value="{{ id }}" />
|
<option ng-repeat="(id,address) in discovery" value="{{ id }}" />
|
||||||
</datalist>
|
</datalist>
|
||||||
<div ng-if="editingExisting" class="well well-sm text-monospace">{{currentDevice.DeviceID}}</div>
|
<div ng-if="editingExisting" class="well well-sm text-monospace">{{currentDevice.deviceID}}</div>
|
||||||
<p class="help-block">
|
<p class="help-block">
|
||||||
<span translate ng-if="deviceEditor.deviceID.$valid || deviceEditor.deviceID.$pristine">The device ID to enter here can be found in the "Edit > Show ID" dialog on the other device. Spaces and dashes are optional (ignored).</span>
|
<span translate ng-if="deviceEditor.deviceID.$valid || deviceEditor.deviceID.$pristine">The device ID to enter here can be found in the "Edit > Show ID" dialog on the other device. Spaces and dashes are optional (ignored).</span>
|
||||||
<span translate ng-show="!editingExisting && (deviceEditor.deviceID.$valid || deviceEditor.deviceID.$pristine)">When adding a new device, keep in mind that this device must be added on the other side too.</span>
|
<span translate ng-show="!editingExisting && (deviceEditor.deviceID.$valid || deviceEditor.deviceID.$pristine)">When adding a new device, keep in mind that this device must be added on the other side too.</span>
|
||||||
@@ -495,18 +488,18 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label translate for="name">Device Name</label>
|
<label translate for="name">Device Name</label>
|
||||||
<input id="name" class="form-control" type="text" ng-model="currentDevice.Name"></input>
|
<input id="name" class="form-control" type="text" ng-model="currentDevice.name"></input>
|
||||||
<p translate ng-if="currentDevice.DeviceID == myID" class="help-block">Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.</p>
|
<p translate ng-if="currentDevice.deviceID == myID" class="help-block">Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.</p>
|
||||||
<p translate ng-if="currentDevice.DeviceID != myID" class="help-block">Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.</p>
|
<p translate ng-if="currentDevice.deviceID != myID" class="help-block">Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label translate for="addresses">Addresses</label>
|
<label translate for="addresses">Addresses</label>
|
||||||
<input ng-disabled="currentDevice.DeviceID == myID" id="addresses" class="form-control" type="text" ng-model="currentDevice.AddressesStr"></input>
|
<input ng-disabled="currentDevice.deviceID == myID" id="addresses" class="form-control" type="text" ng-model="currentDevice.addressesStr"></input>
|
||||||
<p translate class="help-block">Enter comma separated "ip:port" addresses or "dynamic" to perform automatic discovery of the address.</p>
|
<p translate class="help-block">Enter comma separated "ip:port" addresses or "dynamic" to perform automatic discovery of the address.</p>
|
||||||
</div>
|
</div>
|
||||||
<div ng-if="!editingSelf" class="form-group">
|
<div ng-if="!editingSelf" class="form-group">
|
||||||
<label translate>Compression</label>
|
<label translate>Compression</label>
|
||||||
<select class="form-control" ng-model="currentDevice.Compression">
|
<select class="form-control" ng-model="currentDevice.compression">
|
||||||
<option value="always" translate>All Data</option>
|
<option value="always" translate>All Data</option>
|
||||||
<option value="metadata" translate>Metadata Only</option>
|
<option value="metadata" translate>Metadata Only</option>
|
||||||
<option value="never" translate>Off</option>
|
<option value="never" translate>Off</option>
|
||||||
@@ -515,7 +508,7 @@
|
|||||||
<div ng-if="!editingSelf" class="form-group">
|
<div ng-if="!editingSelf" class="form-group">
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" ng-model="currentDevice.Introducer"> <span translate>Introducer</span>
|
<input type="checkbox" ng-model="currentDevice.introducer"> <span translate>Introducer</span>
|
||||||
</label>
|
</label>
|
||||||
<p translate class="help-block">Any devices configured on an introducer device will be added to this device as well.</p>
|
<p translate class="help-block">Any devices configured on an introducer device will be added to this device as well.</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -529,7 +522,7 @@
|
|||||||
<div class="three-columns">
|
<div class="three-columns">
|
||||||
<div class="checkbox" ng-repeat="folder in folderList()">
|
<div class="checkbox" ng-repeat="folder in folderList()">
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" ng-model="currentDevice.selectedFolders[folder.ID]"> {{folder.ID}}
|
<input type="checkbox" ng-model="currentDevice.selectedFolders[folder.id]"> {{folder.id}}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -563,7 +556,7 @@
|
|||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<div class="form-group" ng-class="{'has-error': folderEditor.folderID.$invalid && folderEditor.folderID.$dirty}">
|
<div class="form-group" ng-class="{'has-error': folderEditor.folderID.$invalid && folderEditor.folderID.$dirty}">
|
||||||
<label for="folderID"><span translate>Folder ID</span></label>
|
<label for="folderID"><span translate>Folder ID</span></label>
|
||||||
<input name="folderID" ng-readonly="editingExisting" id="folderID" class="form-control" type="text" ng-model="currentFolder.ID" required unique-folder ng-pattern="/^[a-zA-Z0-9-_.]{1,64}$/"></input>
|
<input name="folderID" ng-readonly="editingExisting" id="folderID" class="form-control" type="text" ng-model="currentFolder.id" required unique-folder ng-pattern="/^[a-zA-Z0-9-_.]{1,64}$/"></input>
|
||||||
<p class="help-block">
|
<p class="help-block">
|
||||||
<span translate ng-if="folderEditor.folderID.$valid || folderEditor.folderID.$pristine">Short identifier for the folder. Must be the same on all cluster devices.</span>
|
<span translate ng-if="folderEditor.folderID.$valid || folderEditor.folderID.$pristine">Short identifier for the folder. Must be the same on all cluster devices.</span>
|
||||||
<span translate ng-if="folderEditor.folderID.$error.uniqueFolder">The folder ID must be unique.</span>
|
<span translate ng-if="folderEditor.folderID.$error.uniqueFolder">The folder ID must be unique.</span>
|
||||||
@@ -573,7 +566,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group" ng-class="{'has-error': folderEditor.folderPath.$invalid && folderEditor.folderPath.$dirty}">
|
<div class="form-group" ng-class="{'has-error': folderEditor.folderPath.$invalid && folderEditor.folderPath.$dirty}">
|
||||||
<label translate for="folderPath">Folder Path</label>
|
<label translate for="folderPath">Folder Path</label>
|
||||||
<input name="folderPath" ng-readonly="editingExisting" id="folderPath" class="form-control" type="text" ng-model="currentFolder.Path" list="directory-list" required />
|
<input name="folderPath" ng-readonly="editingExisting" id="folderPath" class="form-control" type="text" ng-model="currentFolder.path" list="directory-list" required />
|
||||||
<datalist id="directory-list">
|
<datalist id="directory-list">
|
||||||
<option ng-repeat="directory in directoryList" value="{{ directory }}" />
|
<option ng-repeat="directory in directoryList" value="{{ directory }}" />
|
||||||
</datalist>
|
</datalist>
|
||||||
@@ -584,7 +577,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group" ng-class="{'has-error': folderEditor.rescanIntervalS.$invalid && folderEditor.rescanIntervalS.$dirty}">
|
<div class="form-group" ng-class="{'has-error': folderEditor.rescanIntervalS.$invalid && folderEditor.rescanIntervalS.$dirty}">
|
||||||
<label for="rescanIntervalS"><span translate>Rescan Interval</span> (s)</label>
|
<label for="rescanIntervalS"><span translate>Rescan Interval</span> (s)</label>
|
||||||
<input name="rescanIntervalS" id="rescanIntervalS" class="form-control" type="number" ng-model="currentFolder.RescanIntervalS" required min="0"></input>
|
<input name="rescanIntervalS" id="rescanIntervalS" class="form-control" type="number" ng-model="currentFolder.rescanIntervalS" required min="0"></input>
|
||||||
<p class="help-block">
|
<p class="help-block">
|
||||||
<span translate ng-if="!folderEditor.rescanIntervalS.$valid && folderEditor.rescanIntervalS.$dirty">The rescan interval must be a non-negative number of seconds.</span>
|
<span translate ng-if="!folderEditor.rescanIntervalS.$valid && folderEditor.rescanIntervalS.$dirty">The rescan interval must be a non-negative number of seconds.</span>
|
||||||
</p>
|
</p>
|
||||||
@@ -596,7 +589,7 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" ng-model="currentFolder.ReadOnly"> <span translate>Folder Master</span>
|
<input type="checkbox" ng-model="currentFolder.readOnly"> <span translate>Folder Master</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<p translate class="help-block">Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.</p>
|
<p translate class="help-block">Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.</p>
|
||||||
@@ -604,7 +597,7 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" ng-model="currentFolder.IgnorePerms"> <span translate>Ignore Permissions</span>
|
<input type="checkbox" ng-model="currentFolder.ignorePerms"> <span translate>Ignore Permissions</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<p translate class="help-block">File permission bits are ignored when looking for changes. Use on FAT filesystems.</p>
|
<p translate class="help-block">File permission bits are ignored when looking for changes. Use on FAT filesystems.</p>
|
||||||
@@ -615,21 +608,26 @@
|
|||||||
<label translate>File Versioning</label>
|
<label translate>File Versioning</label>
|
||||||
<div class="radio">
|
<div class="radio">
|
||||||
<label>
|
<label>
|
||||||
<input type="radio" ng-model="currentFolder.FileVersioningSelector" value="none"> <span translate>No File Versioning</span>
|
<input type="radio" ng-model="currentFolder.fileVersioningSelector" value="none"> <span translate>No File Versioning</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="radio">
|
<div class="radio">
|
||||||
<label>
|
<label>
|
||||||
<input type="radio" ng-model="currentFolder.FileVersioningSelector" value="simple"> <span translate>Simple File Versioning</span>
|
<input type="radio" ng-model="currentFolder.fileVersioningSelector" value="simple"> <span translate>Simple File Versioning</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="radio">
|
<div class="radio">
|
||||||
<label>
|
<label>
|
||||||
<input type="radio" ng-model="currentFolder.FileVersioningSelector" value="staggered"> <span translate>Staggered File Versioning</span>
|
<input type="radio" ng-model="currentFolder.fileVersioningSelector" value="staggered"> <span translate>Staggered File Versioning</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="radio">
|
||||||
|
<label>
|
||||||
|
<input type="radio" ng-model="currentFolder.fileVersioningSelector" value="external"> <span translate>External File Versioning</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group" ng-if="currentFolder.FileVersioningSelector=='simple'" ng-class="{'has-error': folderEditor.simpleKeep.$invalid && folderEditor.simpleKeep.$dirty}">
|
<div class="form-group" ng-if="currentFolder.fileVersioningSelector=='simple'" ng-class="{'has-error': folderEditor.simpleKeep.$invalid && folderEditor.simpleKeep.$dirty}">
|
||||||
<p translate class="help-block">Files are moved to date stamped versions in a .stversions folder when replaced or deleted by syncthing.</p>
|
<p translate class="help-block">Files are moved to date stamped versions in a .stversions folder when replaced or deleted by syncthing.</p>
|
||||||
<label translate for="simpleKeep">Keep Versions</label>
|
<label translate for="simpleKeep">Keep Versions</label>
|
||||||
<input name="simpleKeep" id="simpleKeep" class="form-control" type="number" ng-model="currentFolder.simpleKeep" required min="1"></input>
|
<input name="simpleKeep" id="simpleKeep" class="form-control" type="number" ng-model="currentFolder.simpleKeep" required min="1"></input>
|
||||||
@@ -639,7 +637,7 @@
|
|||||||
<span translate ng-if="folderEditor.simpleKeep.$error.min && folderEditor.simpleKeep.$dirty">You must keep at least one version.</span>
|
<span translate ng-if="folderEditor.simpleKeep.$error.min && folderEditor.simpleKeep.$dirty">You must keep at least one version.</span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group" ng-if="currentFolder.FileVersioningSelector=='staggered'" ng-class="{'has-error': folderEditor.staggeredMaxAge.$invalid && folderEditor.staggeredMaxAge.$dirty}">
|
<div class="form-group" ng-if="currentFolder.fileVersioningSelector=='staggered'" ng-class="{'has-error': folderEditor.staggeredMaxAge.$invalid && folderEditor.staggeredMaxAge.$dirty}">
|
||||||
<p class="help-block"><span translate>Files are moved to date stamped versions in a .stversions folder when replaced or deleted by syncthing.</span> <span translate>Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.</span></p>
|
<p class="help-block"><span translate>Files are moved to date stamped versions in a .stversions folder when replaced or deleted by syncthing.</span> <span translate>Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.</span></p>
|
||||||
<p translate class="help-block">The following intervals are used: for the first hour a version is kept every 30 seconds, for the first day a version is kept every hour, for the first 30 days a version is kept every day, until the maximum age a version is kept every week.</p>
|
<p translate class="help-block">The following intervals are used: for the first hour a version is kept every 30 seconds, for the first day a version is kept every hour, for the first 30 days a version is kept every day, until the maximum age a version is kept every week.</p>
|
||||||
<label translate for="staggeredMaxAge">Maximum Age</label>
|
<label translate for="staggeredMaxAge">Maximum Age</label>
|
||||||
@@ -649,11 +647,20 @@
|
|||||||
<span translate ng-if="folderEditor.staggeredMaxAge.$error.required && folderEditor.staggeredMaxAge.$dirty">The maximum age must be a number and cannot be blank.</span>
|
<span translate ng-if="folderEditor.staggeredMaxAge.$error.required && folderEditor.staggeredMaxAge.$dirty">The maximum age must be a number and cannot be blank.</span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group" ng-if="currentFolder.FileVersioningSelector == 'staggered'">
|
<div class="form-group" ng-if="currentFolder.fileVersioningSelector == 'staggered'">
|
||||||
<label translate for="staggeredVersionsPath">Versions Path</label>
|
<label translate for="staggeredVersionsPath">Versions Path</label>
|
||||||
<input name="staggeredVersionsPath" id="staggeredVersionsPath" class="form-control" type="text" ng-model="currentFolder.staggeredVersionsPath"></input>
|
<input name="staggeredVersionsPath" id="staggeredVersionsPath" class="form-control" type="text" ng-model="currentFolder.staggeredVersionsPath"></input>
|
||||||
<p translate class="help-block">Path where versions should be stored (leave empty for the default .stversions folder in the folder).</p>
|
<p translate class="help-block">Path where versions should be stored (leave empty for the default .stversions folder in the folder).</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group" ng-if="currentFolder.fileVersioningSelector=='external'" ng-class="{'has-error': folderEditor.externalCommand.$invalid && folderEditor.externalCommand.$dirty}">
|
||||||
|
<p translate class="help-block">A external command handles the versioning. It has to remove the file from the synced folder.</p>
|
||||||
|
<label translate for="externalCommand">Command</label>
|
||||||
|
<input name="externalCommand" id="externalCommand" class="form-control" type="text" ng-model="currentFolder.externalCommand" required></input>
|
||||||
|
<p class="help-block">
|
||||||
|
<span translate ng-if="folderEditor.externalCommand.$valid || folderEditor.externalCommand.$pristine">The first command line parameter is the folder path and the second parameter is the relative path in the folder.</span>
|
||||||
|
<span translate ng-if="folderEditor.externalCommand.$error.required && folderEditor.externalCommand.$dirty">The path cannot be blank.</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -665,7 +672,7 @@
|
|||||||
<div class="three-columns">
|
<div class="three-columns">
|
||||||
<div class="checkbox" ng-repeat="device in otherDevices()">
|
<div class="checkbox" ng-repeat="device in otherDevices()">
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" ng-model="currentFolder.selectedDevices[device.DeviceID]"> {{deviceName(device)}}
|
<input type="checkbox" ng-model="currentFolder.selectedDevices[device.deviceID]"> {{deviceName(device)}}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -709,7 +716,7 @@
|
|||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<div class="pull-left"><span translate>Editing</span> <code>{{currentFolder.Path}}{{system.pathSeparator}}.stignore</code></div>
|
<div class="pull-left"><span translate>Editing</span> <code>{{currentFolder.path}}{{system.pathSeparator}}.stignore</code></div>
|
||||||
<button type="button" class="btn btn-primary btn-sm" data-dismiss="modal" ng-click="saveIgnores()"><span class="glyphicon glyphicon-ok"></span> <span translate>Save</span></button>
|
<button type="button" class="btn btn-primary btn-sm" data-dismiss="modal" ng-click="saveIgnores()"><span class="glyphicon glyphicon-ok"></span> <span translate>Save</span></button>
|
||||||
<button type="button" class="btn btn-default btn-sm" data-dismiss="modal"><span class="glyphicon glyphicon-remove"></span> <span translate>Close</span></button>
|
<button type="button" class="btn btn-default btn-sm" data-dismiss="modal"><span class="glyphicon glyphicon-remove"></span> <span translate>Close</span></button>
|
||||||
</div>
|
</div>
|
||||||
@@ -732,32 +739,32 @@
|
|||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label translate for="DeviceName">Device Name</label>
|
<label translate for="DeviceName">Device Name</label>
|
||||||
<input id="DeviceName" class="form-control" type="text" ng-model="tmpOptions.DeviceName">
|
<input id="DeviceName" class="form-control" type="text" ng-model="tmpOptions.deviceName">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label translate for="ListenAddressStr">Sync Protocol Listen Addresses</label>
|
<label translate for="ListenAddressStr">Sync Protocol Listen Addresses</label>
|
||||||
<input id="ListenAddressStr" class="form-control" type="text" ng-model="tmpOptions.ListenAddressStr">
|
<input id="ListenAddressStr" class="form-control" type="text" ng-model="tmpOptions.listenAddressStr">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label translate for="MaxRecvKbps">Incoming Rate Limit (KiB/s)</label>
|
<label translate for="MaxRecvKbps">Incoming Rate Limit (KiB/s)</label>
|
||||||
<input id="MaxRecvKbps" class="form-control" type="number" ng-model="tmpOptions.MaxRecvKbps">
|
<input id="MaxRecvKbps" class="form-control" type="number" ng-model="tmpOptions.maxRecvKbps">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label translate for="MaxSendKbps">Outgoing Rate Limit (KiB/s)</label>
|
<label translate for="MaxSendKbps">Outgoing Rate Limit (KiB/s)</label>
|
||||||
<input id="MaxSendKbps" class="form-control" type="number" ng-model="tmpOptions.MaxSendKbps">
|
<input id="MaxSendKbps" class="form-control" type="number" ng-model="tmpOptions.maxSendKbps">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label>
|
<label>
|
||||||
<input id="UPnPEnabled" type="checkbox" ng-model="tmpOptions.UPnPEnabled"> <span translate>Enable UPnP</span>
|
<input id="UPnPEnabled" type="checkbox" ng-model="tmpOptions.upnpEnabled"> <span translate>Enable UPnP</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label>
|
<label>
|
||||||
<input id="GlobalAnnEnabled" type="checkbox" ng-model="tmpOptions.GlobalAnnEnabled"> <span translate>Global Discovery</span>
|
<input id="GlobalAnnEnabled" type="checkbox" ng-model="tmpOptions.globalAnnounceEnabled"> <span translate>Global Discovery</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -766,55 +773,55 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label ng-if="upgradeInfo">
|
<label ng-if="upgradeInfo">
|
||||||
<input id="AutoUpgradeEnabled" type="checkbox" ng-model="tmpOptions.AutoUpgradeEnabled"> <span translate>Automatic upgrades</span>
|
<input id="AutoUpgradeEnabled" type="checkbox" ng-model="tmpOptions.autoUpgradeEnabled"> <span translate>Automatic upgrades</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label>
|
<label>
|
||||||
<input id="LocalAnnEnabled" type="checkbox" ng-model="tmpOptions.LocalAnnEnabled"> <span translate>Local Discovery</span>
|
<input id="LocalAnnEnabled" type="checkbox" ng-model="tmpOptions.localAnnounceEnabled"> <span translate>Local Discovery</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label translate for="GlobalAnnServersStr">Global Discovery Server</label>
|
<label translate for="GlobalAnnServersStr">Global Discovery Server</label>
|
||||||
<input ng-disabled="!tmpOptions.GlobalAnnEnabled" id="GlobalAnnServersStr" class="form-control" type="text" ng-model="tmpOptions.GlobalAnnServersStr">
|
<input ng-disabled="!tmpOptions.globalAnnounceEnabled" id="GlobalAnnServersStr" class="form-control" type="text" ng-model="tmpOptions.globalAnnounceServersStr">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label translate for="Address">GUI Listen Addresses</label>
|
<label translate for="Address">GUI Listen Addresses</label>
|
||||||
<input id="Address" class="form-control" type="text" ng-model="tmpGUI.Address">
|
<input id="Address" class="form-control" type="text" ng-model="tmpGUI.address">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label translate for="User">GUI Authentication User</label>
|
<label translate for="User">GUI Authentication User</label>
|
||||||
<input id="User" class="form-control" type="text" ng-model="tmpGUI.User">
|
<input id="User" class="form-control" type="text" ng-model="tmpGUI.user">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label translate for="Password">GUI Authentication Password</label>
|
<label translate for="Password">GUI Authentication Password</label>
|
||||||
<input id="Password" class="form-control" type="password" ng-model="tmpGUI.Password">
|
<input id="Password" class="form-control" type="password" ng-model="tmpGUI.password">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label>
|
<label>
|
||||||
<input id="UseTLS" type="checkbox" ng-model="tmpGUI.UseTLS"> <span translate>Use HTTPS for GUI</span>
|
<input id="UseTLS" type="checkbox" ng-model="tmpGUI.useTLS"> <span translate>Use HTTPS for GUI</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label>
|
<label>
|
||||||
<input id="StartBrowser" type="checkbox" ng-model="tmpOptions.StartBrowser"> <span translate>Start Browser</span>
|
<input id="StartBrowser" type="checkbox" ng-model="tmpOptions.startBrowser"> <span translate>Start Browser</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label>
|
<label>
|
||||||
<input id="UREnabled" type="checkbox" ng-model="tmpOptions.UREnabled"> <span translate>Anonymous Usage Reporting</span> (<a translate ng-click="showURPreview()" href="#">Preview</a>)
|
<input id="UREnabled" type="checkbox" ng-model="tmpOptions.urEnabled"> <span translate>Anonymous Usage Reporting</span> (<a translate ng-click="showURPreview()" href="#">Preview</a>)
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -823,7 +830,7 @@
|
|||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label><span translate>API Key</span></label>
|
<label><span translate>API Key</span></label>
|
||||||
<div class="well well-sm text-monospace">{{tmpGUI.APIKey || "-"}}</div>
|
<div class="well well-sm text-monospace">{{tmpGUI.apiKey || "-"}}</div>
|
||||||
<button translate type="button" class="btn btn-sm btn-default" ng-click="setAPIKey(tmpGUI)">Generate</button>
|
<button translate type="button" class="btn btn-sm btn-default" ng-click="setAPIKey(tmpGUI)">Generate</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -897,34 +904,34 @@
|
|||||||
<table class="table table-striped table-condensed">
|
<table class="table table-striped table-condensed">
|
||||||
<tr ng-repeat="f in needed.progress" ng-init="a = needAction(f)">
|
<tr ng-repeat="f in needed.progress" ng-init="a = needAction(f)">
|
||||||
<td class="small-data"><span class="glyphicon glyphicon-{{needIcons[a]}}"></span> {{needActions[a]}}</td>
|
<td class="small-data"><span class="glyphicon glyphicon-{{needIcons[a]}}"></span> {{needActions[a]}}</td>
|
||||||
<td title="{{f.Name}}">{{f.Name | basename}}</td>
|
<td title="{{f.name}}">{{f.name | basename}}</td>
|
||||||
<td ng-if="a == 'sync' && progress[neededFolder] && progress[neededFolder][f.Name]">
|
<td ng-if="a == 'sync' && progress[neededFolder] && progress[neededFolder][f.name]">
|
||||||
<div class="progress">
|
<div class="progress">
|
||||||
<div class="progress-bar progress-bar-success" style="width: {{progress[neededFolder][f.Name].Reused}}%"></div>
|
<div class="progress-bar progress-bar-success" style="width: {{progress[neededFolder][f.name].reused}}%"></div>
|
||||||
<div class="progress-bar" style="width: {{progress[neededFolder][f.Name].CopiedFromOrigin}}%"></div>
|
<div class="progress-bar" style="width: {{progress[neededFolder][f.name].copiedFromOrigin}}%"></div>
|
||||||
<div class="progress-bar progress-bar-info" style="width: {{progress[neededFolder][f.Name].CopiedFromElsewhere}}%"></div>
|
<div class="progress-bar progress-bar-info" style="width: {{progress[neededFolder][f.name].copiedFromElsewhere}}%"></div>
|
||||||
<div class="progress-bar progress-bar-warning" style="width: {{progress[neededFolder][f.Name].Pulled}}%"></div>
|
<div class="progress-bar progress-bar-warning" style="width: {{progress[neededFolder][f.name].pulled}}%"></div>
|
||||||
<div class="progress-bar progress-bar-danger progress-bar-striped active" style="width: {{progress[neededFolder][f.Name].Pulling}}%"></div>
|
<div class="progress-bar progress-bar-danger progress-bar-striped active" style="width: {{progress[neededFolder][f.name].pulling}}%"></div>
|
||||||
<span class="show frontal">
|
<span class="show frontal">
|
||||||
{{progress[neededFolder][f.Name].BytesDone | binary}}B / {{progress[neededFolder][f.Name].BytesTotal | binary}}B
|
{{progress[neededFolder][f.name].bytesDone | binary}}B / {{progress[neededFolder][f.name].bytesTotal | binary}}B
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-right small-data" ng-if="a != 'sync' || !progress[neededFolder] || !progress[neededFolder][f.Name]">
|
<td class="text-right small-data" ng-if="a != 'sync' || !progress[neededFolder] || !progress[neededFolder][f.name]">
|
||||||
<span ng-if="f.Size > 0">{{f.Size | binary}}B</span>
|
<span ng-if="f.size > 0">{{f.size | binary}}B</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-repeat="f in needed.queued" ng-init="a = needAction(f)">
|
<tr ng-repeat="f in needed.queued" ng-init="a = needAction(f)">
|
||||||
<td class="small-data"><span class="glyphicon glyphicon-{{needIcons[a]}}"></span> {{needActions[a]}}</td>
|
<td class="small-data"><span class="glyphicon glyphicon-{{needIcons[a]}}"></span> {{needActions[a]}}</td>
|
||||||
<td><a href="" ng-if="$index != 0" ng-click="bumpFile(neededFolder, f.Name)" title="{{'Move to top of queue' | translate}}"><span class="glyphicon glyphicon-eject"></span></a><span ng-if="$index != 0"> </span><span title="{{f.Name}}">{{f.Name | basename}}</span></td>
|
<td><a href="" ng-if="$index != 0" ng-click="bumpFile(neededFolder, f.name)" title="{{'Move to top of queue' | translate}}"><span class="glyphicon glyphicon-eject"></span></a><span ng-if="$index != 0"> </span><span title="{{f.name}}">{{f.name | basename}}</span></td>
|
||||||
<td class="text-right small-data">
|
<td class="text-right small-data">
|
||||||
<span ng-if="f.Size > 0">{{f.Size | binary}}B</span>
|
<span ng-if="f.size > 0">{{f.size | binary}}B</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr ng-repeat="f in needed.rest" ng-init="a = needAction(f)">
|
<tr ng-repeat="f in needed.rest" ng-init="a = needAction(f)">
|
||||||
<td class="small-data"><span class="glyphicon glyphicon-{{needIcons[a]}}"></span> {{needActions[a]}}</td>
|
<td class="small-data"><span class="glyphicon glyphicon-{{needIcons[a]}}"></span> {{needActions[a]}}</td>
|
||||||
<td title="{{f.Name}}">{{f.Name | basename}}</td>
|
<td title="{{f.name}}">{{f.name | basename}}</td>
|
||||||
<td class="text-right small-data"><span ng-if="f.Size > 0">{{f.Size | binary}}B</span></td>
|
<td class="text-right small-data"><span ng-if="f.size > 0">{{f.size | binary}}B</span></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@@ -933,7 +940,7 @@
|
|||||||
<!-- About modal -->
|
<!-- About modal -->
|
||||||
|
|
||||||
<modal id="about" large="yes" close="yes" status="info" title="{{'About' | translate}}">
|
<modal id="about" large="yes" close="yes" status="info" title="{{'About' | translate}}">
|
||||||
<h1 class="text-center"><img alt="Syncthing" title="Syncthing" src="assets/img/logo-text-256.png" style="vertical-align: -16px" height="100" width="366"/><br/><small>{{version}}</small></h1>
|
<h1 class="text-center"><img alt="Syncthing" title="Syncthing" src="assets/img/logo-horizontal.svg" style="vertical-align: -16px" height="100" width="366"/><br/><small>{{version}}</small></h1>
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
<p translate>Copyright © 2014 Jakob Borg and the following Contributors:</p>
|
<p translate>Copyright © 2014 Jakob Borg and the following Contributors:</p>
|
||||||
@@ -965,6 +972,7 @@
|
|||||||
<li>James Patterson</li>
|
<li>James Patterson</li>
|
||||||
<li>Jens Diemer</li>
|
<li>Jens Diemer</li>
|
||||||
<li>Jochen Voss</li>
|
<li>Jochen Voss</li>
|
||||||
|
<li>Johan Vromans</li>
|
||||||
<li>Kamada Ken'ichi</li>
|
<li>Kamada Ken'ichi</li>
|
||||||
<li>Karol Różycki</li>
|
<li>Karol Różycki</li>
|
||||||
<li>Lode Hoste</li>
|
<li>Lode Hoste</li>
|
||||||
|
|||||||
+3
-12
@@ -2,18 +2,9 @@
|
|||||||
<!--
|
<!--
|
||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
-->
|
-->
|
||||||
<div class="modal-dialog" ng-class="{'modal-lg': large}">
|
<div class="modal-dialog" ng-class="{'modal-lg': large}">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
|
|||||||
@@ -1,17 +1,9 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
/*jslint browser: true, continue: true, plusplus: true */
|
/*jslint browser: true, continue: true, plusplus: true */
|
||||||
/*global $: false, angular: false, console: false, validLangs: false */
|
/*global $: false, angular: false, console: false, validLangs: false */
|
||||||
@@ -78,7 +70,7 @@ function folderCompare(a, b) {
|
|||||||
function folderMap(l) {
|
function folderMap(l) {
|
||||||
var m = {};
|
var m = {};
|
||||||
l.forEach(function (r) {
|
l.forEach(function (r) {
|
||||||
m[r.ID] = r;
|
m[r.id] = r;
|
||||||
});
|
});
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,8 +141,8 @@ angular.module('syncthing.core')
|
|||||||
refreshFolderStats();
|
refreshFolderStats();
|
||||||
|
|
||||||
// Update completion status for all devices that we share this folder with.
|
// Update completion status for all devices that we share this folder with.
|
||||||
$scope.folders[data.folder].Devices.forEach(function (deviceCfg) {
|
$scope.folders[data.folder].devices.forEach(function (deviceCfg) {
|
||||||
refreshCompletion(deviceCfg.DeviceID, data.folder);
|
refreshCompletion(deviceCfg.deviceID, data.folder);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -162,9 +162,9 @@ angular.module('syncthing.core')
|
|||||||
$scope.connections[arg.data.id] = {
|
$scope.connections[arg.data.id] = {
|
||||||
inbps: 0,
|
inbps: 0,
|
||||||
outbps: 0,
|
outbps: 0,
|
||||||
InBytesTotal: 0,
|
inBytesTotal: 0,
|
||||||
OutBytesTotal: 0,
|
outBytesTotal: 0,
|
||||||
Address: arg.data.addr
|
address: arg.data.addr
|
||||||
};
|
};
|
||||||
$scope.completion[arg.data.id] = {
|
$scope.completion[arg.data.id] = {
|
||||||
_total: 100
|
_total: 100
|
||||||
@@ -173,7 +173,7 @@ angular.module('syncthing.core')
|
|||||||
});
|
});
|
||||||
|
|
||||||
$scope.$on('ConfigLoaded', function (event) {
|
$scope.$on('ConfigLoaded', function (event) {
|
||||||
if ($scope.config.Options.URAccepted === 0) {
|
if ($scope.config.options.urAccepted === 0) {
|
||||||
// If usage reporting has been neither accepted nor declined,
|
// If usage reporting has been neither accepted nor declined,
|
||||||
// we want to ask the user to make a choice. But we don't want
|
// we want to ask the user to make a choice. But we don't want
|
||||||
// to bug them during initial setup, so we set a cookie with
|
// to bug them during initial setup, so we set a cookie with
|
||||||
@@ -216,23 +216,23 @@ angular.module('syncthing.core')
|
|||||||
progress[folder] = {};
|
progress[folder] = {};
|
||||||
for (var file in stats[folder]) {
|
for (var file in stats[folder]) {
|
||||||
var s = stats[folder][file];
|
var s = stats[folder][file];
|
||||||
var reused = 100 * s.Reused / s.Total;
|
var reused = 100 * s.reused / s.total;
|
||||||
var copiedFromOrigin = 100 * s.CopiedFromOrigin / s.Total;
|
var copiedFromOrigin = 100 * s.copiedFromOrigin / s.total;
|
||||||
var copiedFromElsewhere = 100 * s.CopiedFromElsewhere / s.Total;
|
var copiedFromElsewhere = 100 * s.copiedFromElsewhere / s.total;
|
||||||
var pulled = 100 * s.Pulled / s.Total;
|
var pulled = 100 * s.pulled / s.total;
|
||||||
var pulling = 100 * s.Pulling / s.Total;
|
var pulling = 100 * s.pulling / s.total;
|
||||||
// We try to round up pulling to atleast a percent so that it would be atleast a bit visible.
|
// We try to round up pulling to atleast a percent so that it would be atleast a bit visible.
|
||||||
if (pulling < 1 && pulled + copiedFromElsewhere + copiedFromOrigin + reused <= 99) {
|
if (pulling < 1 && pulled + copiedFromElsewhere + copiedFromOrigin + reused <= 99) {
|
||||||
pulling = 1;
|
pulling = 1;
|
||||||
}
|
}
|
||||||
progress[folder][file] = {
|
progress[folder][file] = {
|
||||||
Reused: reused,
|
reused: reused,
|
||||||
CopiedFromOrigin: copiedFromOrigin,
|
copiedFromOrigin: copiedFromOrigin,
|
||||||
CopiedFromElsewhere: copiedFromElsewhere,
|
copiedFromElsewhere: copiedFromElsewhere,
|
||||||
Pulled: pulled,
|
pulled: pulled,
|
||||||
Pulling: pulling,
|
pulling: pulling,
|
||||||
BytesTotal: s.BytesTotal,
|
bytesTotal: s.bytesTotal,
|
||||||
BytesDone: s.BytesDone,
|
bytesDone: s.bytesDone,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -278,22 +278,21 @@ angular.module('syncthing.core')
|
|||||||
var hasConfig = !isEmptyObject($scope.config);
|
var hasConfig = !isEmptyObject($scope.config);
|
||||||
|
|
||||||
$scope.config = config;
|
$scope.config = config;
|
||||||
$scope.config.Options.ListenAddressStr = $scope.config.Options.ListenAddress.join(', ');
|
$scope.config.options.listenAddressStr = $scope.config.options.listenAddress.join(', ');
|
||||||
$scope.config.Options.GlobalAnnServersStr = $scope.config.Options.GlobalAnnServers.join(', ');
|
$scope.config.options.globalAnnounceServersStr = $scope.config.options.globalAnnounceServers.join(', ');
|
||||||
|
|
||||||
$scope.devices = $scope.config.Devices;
|
$scope.devices = $scope.config.devices;
|
||||||
$scope.devices.forEach(function (deviceCfg) {
|
$scope.devices.forEach(function (deviceCfg) {
|
||||||
$scope.completion[deviceCfg.DeviceID] = {
|
$scope.completion[deviceCfg.deviceID] = {
|
||||||
_total: 100
|
_total: 100
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
$scope.devices.sort(deviceCompare);
|
$scope.devices.sort(deviceCompare);
|
||||||
|
$scope.folders = folderMap($scope.config.folders);
|
||||||
$scope.folders = folderMap($scope.config.Folders);
|
|
||||||
Object.keys($scope.folders).forEach(function (folder) {
|
Object.keys($scope.folders).forEach(function (folder) {
|
||||||
refreshFolder(folder);
|
refreshFolder(folder);
|
||||||
$scope.folders[folder].Devices.forEach(function (deviceCfg) {
|
$scope.folders[folder].devices.forEach(function (deviceCfg) {
|
||||||
refreshCompletion(deviceCfg.DeviceID, folder);
|
refreshCompletion(deviceCfg.deviceID, folder);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -362,8 +361,8 @@ angular.module('syncthing.core')
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
data[id].inbps = Math.max(0, (data[id].InBytesTotal - $scope.connections[id].InBytesTotal) / td);
|
data[id].inbps = Math.max(0, (data[id].inBytesTotal - $scope.connections[id].inBytesTotal) / td);
|
||||||
data[id].outbps = Math.max(0, (data[id].OutBytesTotal - $scope.connections[id].OutBytesTotal) / td);
|
data[id].outbps = Math.max(0, (data[id].outBytesTotal - $scope.connections[id].outBytesTotal) / td);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
data[id].inbps = 0;
|
data[id].inbps = 0;
|
||||||
data[id].outbps = 0;
|
data[id].outbps = 0;
|
||||||
@@ -405,8 +404,8 @@ angular.module('syncthing.core')
|
|||||||
$http.get(urlbase + "/stats/device").success(function (data) {
|
$http.get(urlbase + "/stats/device").success(function (data) {
|
||||||
$scope.deviceStats = data;
|
$scope.deviceStats = data;
|
||||||
for (var device in $scope.deviceStats) {
|
for (var device in $scope.deviceStats) {
|
||||||
$scope.deviceStats[device].LastSeen = new Date($scope.deviceStats[device].LastSeen);
|
$scope.deviceStats[device].lastSeen = new Date($scope.deviceStats[device].lastSeen);
|
||||||
$scope.deviceStats[device].LastSeenDays = (new Date() - $scope.deviceStats[device].LastSeen) / 1000 / 86400;
|
$scope.deviceStats[device].lastSeenDays = (new Date() - $scope.deviceStats[device].lastSeen) / 1000 / 86400;
|
||||||
}
|
}
|
||||||
console.log("refreshDeviceStats", data);
|
console.log("refreshDeviceStats", data);
|
||||||
}).error($scope.emitHTTPError);
|
}).error($scope.emitHTTPError);
|
||||||
@@ -416,8 +415,8 @@ angular.module('syncthing.core')
|
|||||||
$http.get(urlbase + "/stats/folder").success(function (data) {
|
$http.get(urlbase + "/stats/folder").success(function (data) {
|
||||||
$scope.folderStats = data;
|
$scope.folderStats = data;
|
||||||
for (var folder in $scope.folderStats) {
|
for (var folder in $scope.folderStats) {
|
||||||
if ($scope.folderStats[folder].LastFile) {
|
if ($scope.folderStats[folder].lastFile) {
|
||||||
$scope.folderStats[folder].LastFile.At = new Date($scope.folderStats[folder].LastFile.At);
|
$scope.folderStats[folder].lastFile.at = new Date($scope.folderStats[folder].lastFile.at);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log("refreshfolderStats", data);
|
console.log("refreshfolderStats", data);
|
||||||
@@ -431,38 +430,38 @@ angular.module('syncthing.core')
|
|||||||
};
|
};
|
||||||
|
|
||||||
$scope.folderStatus = function (folderCfg) {
|
$scope.folderStatus = function (folderCfg) {
|
||||||
if (typeof $scope.model[folderCfg.ID] === 'undefined') {
|
if (typeof $scope.model[folderCfg.id] === 'undefined') {
|
||||||
return 'unknown';
|
return 'unknown';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (folderCfg.Devices.length <= 1) {
|
if (folderCfg.devices.length <= 1) {
|
||||||
return 'unshared';
|
return 'unshared';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($scope.model[folderCfg.ID].invalid !== '') {
|
if ($scope.model[folderCfg.id].invalid !== '') {
|
||||||
return 'stopped';
|
return 'stopped';
|
||||||
}
|
}
|
||||||
|
|
||||||
return '' + $scope.model[folderCfg.ID].state;
|
return '' + $scope.model[folderCfg.id].state;
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.folderClass = function (folderCfg) {
|
$scope.folderClass = function (folderCfg) {
|
||||||
if (typeof $scope.model[folderCfg.ID] === 'undefined') {
|
if (typeof $scope.model[folderCfg.id] === 'undefined') {
|
||||||
// Unknown
|
// Unknown
|
||||||
return 'info';
|
return 'info';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (folderCfg.Devices.length <= 1) {
|
if (folderCfg.devices.length <= 1) {
|
||||||
// Unshared
|
// Unshared
|
||||||
return 'warning';
|
return 'warning';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($scope.model[folderCfg.ID].invalid !== '') {
|
if ($scope.model[folderCfg.id].invalid !== '') {
|
||||||
// Errored
|
// Errored
|
||||||
return 'danger';
|
return 'danger';
|
||||||
}
|
}
|
||||||
|
|
||||||
var state = '' + $scope.model[folderCfg.ID].state;
|
var state = '' + $scope.model[folderCfg.id].state;
|
||||||
if (state == 'idle') {
|
if (state == 'idle') {
|
||||||
return 'success';
|
return 'success';
|
||||||
}
|
}
|
||||||
@@ -488,8 +487,8 @@ angular.module('syncthing.core')
|
|||||||
};
|
};
|
||||||
|
|
||||||
$scope.deviceIcon = function (deviceCfg) {
|
$scope.deviceIcon = function (deviceCfg) {
|
||||||
if ($scope.connections[deviceCfg.DeviceID]) {
|
if ($scope.connections[deviceCfg.deviceID]) {
|
||||||
if ($scope.completion[deviceCfg.DeviceID] && $scope.completion[deviceCfg.DeviceID]._total === 100) {
|
if ($scope.completion[deviceCfg.deviceID] && $scope.completion[deviceCfg.deviceID]._total === 100) {
|
||||||
return 'ok';
|
return 'ok';
|
||||||
} else {
|
} else {
|
||||||
return 'refresh';
|
return 'refresh';
|
||||||
@@ -504,8 +503,8 @@ angular.module('syncthing.core')
|
|||||||
return 'unused';
|
return 'unused';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($scope.connections[deviceCfg.DeviceID]) {
|
if ($scope.connections[deviceCfg.deviceID]) {
|
||||||
if ($scope.completion[deviceCfg.DeviceID] && $scope.completion[deviceCfg.DeviceID]._total === 100) {
|
if ($scope.completion[deviceCfg.deviceID] && $scope.completion[deviceCfg.deviceID]._total === 100) {
|
||||||
return 'insync';
|
return 'insync';
|
||||||
} else {
|
} else {
|
||||||
return 'syncing';
|
return 'syncing';
|
||||||
@@ -522,8 +521,8 @@ angular.module('syncthing.core')
|
|||||||
return 'warning';
|
return 'warning';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($scope.connections[deviceCfg.DeviceID]) {
|
if ($scope.connections[deviceCfg.deviceID]) {
|
||||||
if ($scope.completion[deviceCfg.DeviceID] && $scope.completion[deviceCfg.DeviceID]._total === 100) {
|
if ($scope.completion[deviceCfg.deviceID] && $scope.completion[deviceCfg.deviceID]._total === 100) {
|
||||||
return 'success';
|
return 'success';
|
||||||
} else {
|
} else {
|
||||||
return 'primary';
|
return 'primary';
|
||||||
@@ -535,24 +534,24 @@ angular.module('syncthing.core')
|
|||||||
};
|
};
|
||||||
|
|
||||||
$scope.deviceAddr = function (deviceCfg) {
|
$scope.deviceAddr = function (deviceCfg) {
|
||||||
var conn = $scope.connections[deviceCfg.DeviceID];
|
var conn = $scope.connections[deviceCfg.deviceID];
|
||||||
if (conn) {
|
if (conn) {
|
||||||
return conn.Address;
|
return conn.address;
|
||||||
}
|
}
|
||||||
return '?';
|
return '?';
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.deviceCompletion = function (deviceCfg) {
|
$scope.deviceCompletion = function (deviceCfg) {
|
||||||
var conn = $scope.connections[deviceCfg.DeviceID];
|
var conn = $scope.connections[deviceCfg.deviceID];
|
||||||
if (conn) {
|
if (conn) {
|
||||||
return conn.Completion + '%';
|
return conn.completion + '%';
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.findDevice = function (deviceID) {
|
$scope.findDevice = function (deviceID) {
|
||||||
var matches = $scope.devices.filter(function (n) {
|
var matches = $scope.devices.filter(function (n) {
|
||||||
return n.DeviceID == deviceID;
|
return n.deviceID == deviceID;
|
||||||
});
|
});
|
||||||
if (matches.length != 1) {
|
if (matches.length != 1) {
|
||||||
return undefined;
|
return undefined;
|
||||||
@@ -564,10 +563,10 @@ angular.module('syncthing.core')
|
|||||||
if (typeof deviceCfg === 'undefined') {
|
if (typeof deviceCfg === 'undefined') {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
if (deviceCfg.Name) {
|
if (deviceCfg.name) {
|
||||||
return deviceCfg.Name;
|
return deviceCfg.name;
|
||||||
}
|
}
|
||||||
return deviceCfg.DeviceID.substr(0, 6);
|
return deviceCfg.deviceID.substr(0, 6);
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.thisDeviceName = function () {
|
$scope.thisDeviceName = function () {
|
||||||
@@ -575,19 +574,19 @@ angular.module('syncthing.core')
|
|||||||
if (typeof device === 'undefined') {
|
if (typeof device === 'undefined') {
|
||||||
return "(unknown device)";
|
return "(unknown device)";
|
||||||
}
|
}
|
||||||
if (device.Name) {
|
if (device.name) {
|
||||||
return device.Name;
|
return device.name;
|
||||||
}
|
}
|
||||||
return device.DeviceID.substr(0, 6);
|
return device.deviceID.substr(0, 6);
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.editSettings = function () {
|
$scope.editSettings = function () {
|
||||||
// Make a working copy
|
// Make a working copy
|
||||||
$scope.tmpOptions = angular.copy($scope.config.Options);
|
$scope.tmpOptions = angular.copy($scope.config.options);
|
||||||
$scope.tmpOptions.UREnabled = ($scope.tmpOptions.URAccepted > 0);
|
$scope.tmpOptions.urEnabled = ($scope.tmpOptions.urAccepted > 0);
|
||||||
$scope.tmpOptions.DeviceName = $scope.thisDevice().Name;
|
$scope.tmpOptions.deviceName = $scope.thisDevice().name;
|
||||||
$scope.tmpOptions.AutoUpgradeEnabled = ($scope.tmpOptions.AutoUpgradeIntervalH > 0);
|
$scope.tmpOptions.autoUpgradeEnabled = ($scope.tmpOptions.autoUpgradeIntervalH > 0);
|
||||||
$scope.tmpGUI = angular.copy($scope.config.GUI);
|
$scope.tmpGUI = angular.copy($scope.config.gui);
|
||||||
$('#settings').modal();
|
$('#settings').modal();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -607,34 +606,34 @@ angular.module('syncthing.core')
|
|||||||
|
|
||||||
$scope.saveSettings = function () {
|
$scope.saveSettings = function () {
|
||||||
// Make sure something changed
|
// Make sure something changed
|
||||||
var changed = !angular.equals($scope.config.Options, $scope.tmpOptions) || !angular.equals($scope.config.GUI, $scope.tmpGUI);
|
var changed = !angular.equals($scope.config.options, $scope.tmpOptions) || !angular.equals($scope.config.gui, $scope.tmpGUI);
|
||||||
if (changed) {
|
if (changed) {
|
||||||
// Check if usage reporting has been enabled or disabled
|
// Check if usage reporting has been enabled or disabled
|
||||||
if ($scope.tmpOptions.UREnabled && $scope.tmpOptions.URAccepted <= 0) {
|
if ($scope.tmpOptions.urEnabled && $scope.tmpOptions.urAccepted <= 0) {
|
||||||
$scope.tmpOptions.URAccepted = 1000;
|
$scope.tmpOptions.urAccepted = 1000;
|
||||||
} else if (!$scope.tmpOptions.UREnabled && $scope.tmpOptions.URAccepted > 0) {
|
} else if (!$scope.tmpOptions.urEnabled && $scope.tmpOptions.urAccepted > 0) {
|
||||||
$scope.tmpOptions.URAccepted = -1;
|
$scope.tmpOptions.urAccepted = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if auto-upgrade has been enabled or disabled
|
// Check if auto-upgrade has been enabled or disabled
|
||||||
if ($scope.tmpOptions.AutoUpgradeEnabled) {
|
if ($scope.tmpOptions.autoUpgradeEnabled) {
|
||||||
$scope.tmpOptions.AutoUpgradeIntervalH = $scope.tmpOptions.AutoUpgradeIntervalH || 12;
|
$scope.tmpOptions.autoUpgradeIntervalH = $scope.tmpOptions.autoUpgradeIntervalH || 12;
|
||||||
} else {
|
} else {
|
||||||
$scope.tmpOptions.AutoUpgradeIntervalH = 0;
|
$scope.tmpOptions.autoUpgradeIntervalH = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if protocol will need to be changed on restart
|
// Check if protocol will need to be changed on restart
|
||||||
if ($scope.config.GUI.UseTLS !== $scope.tmpGUI.UseTLS) {
|
if ($scope.config.gui.useTLS !== $scope.tmpGUI.useTLS) {
|
||||||
$scope.protocolChanged = true;
|
$scope.protocolChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply new settings locally
|
// Apply new settings locally
|
||||||
$scope.thisDevice().Name = $scope.tmpOptions.DeviceName;
|
$scope.thisDevice().name = $scope.tmpOptions.deviceName;
|
||||||
$scope.config.Options = angular.copy($scope.tmpOptions);
|
$scope.config.options = angular.copy($scope.tmpOptions);
|
||||||
$scope.config.GUI = angular.copy($scope.tmpGUI);
|
$scope.config.gui = angular.copy($scope.tmpGUI);
|
||||||
|
|
||||||
['ListenAddress', 'GlobalAnnServers'].forEach(function (key) {
|
['listenAddress', 'globalAnnounceServers'].forEach(function (key) {
|
||||||
$scope.config.Options[key] = $scope.config.Options[key + "Str"].split(/[ ,]+/).map(function (x) {
|
$scope.config.options[key] = $scope.config.options[key + "Str"].split(/[ ,]+/).map(function (x) {
|
||||||
return x.trim();
|
return x.trim();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -655,7 +654,7 @@ angular.module('syncthing.core')
|
|||||||
if ($scope.protocolChanged) {
|
if ($scope.protocolChanged) {
|
||||||
var protocol = 'http';
|
var protocol = 'http';
|
||||||
|
|
||||||
if ($scope.config.GUI.UseTLS) {
|
if ($scope.config.gui.useTLS) {
|
||||||
protocol = 'https';
|
protocol = 'https';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -689,8 +688,8 @@ angular.module('syncthing.core')
|
|||||||
$scope.editDevice = function (deviceCfg) {
|
$scope.editDevice = function (deviceCfg) {
|
||||||
$scope.currentDevice = $.extend({}, deviceCfg);
|
$scope.currentDevice = $.extend({}, deviceCfg);
|
||||||
$scope.editingExisting = true;
|
$scope.editingExisting = true;
|
||||||
$scope.editingSelf = (deviceCfg.DeviceID == $scope.myID);
|
$scope.editingSelf = (deviceCfg.deviceID == $scope.myID);
|
||||||
$scope.currentDevice.AddressesStr = deviceCfg.Addresses.join(', ');
|
$scope.currentDevice.addressesStr = deviceCfg.addresses.join(', ');
|
||||||
if (!$scope.editingSelf) {
|
if (!$scope.editingSelf) {
|
||||||
$scope.currentDevice.selectedFolders = {};
|
$scope.currentDevice.selectedFolders = {};
|
||||||
$scope.deviceFolders($scope.currentDevice).forEach(function (folder) {
|
$scope.deviceFolders($scope.currentDevice).forEach(function (folder) {
|
||||||
@@ -712,9 +711,9 @@ angular.module('syncthing.core')
|
|||||||
})
|
})
|
||||||
.then(function () {
|
.then(function () {
|
||||||
$scope.currentDevice = {
|
$scope.currentDevice = {
|
||||||
AddressesStr: 'dynamic',
|
addressesStr: 'dynamic',
|
||||||
Compression: 'metadata',
|
compression: 'metadata',
|
||||||
Introducer: false,
|
introducer: false,
|
||||||
selectedFolders: {}
|
selectedFolders: {}
|
||||||
};
|
};
|
||||||
$scope.editingExisting = false;
|
$scope.editingExisting = false;
|
||||||
@@ -731,18 +730,18 @@ angular.module('syncthing.core')
|
|||||||
}
|
}
|
||||||
|
|
||||||
$scope.devices = $scope.devices.filter(function (n) {
|
$scope.devices = $scope.devices.filter(function (n) {
|
||||||
return n.DeviceID !== $scope.currentDevice.DeviceID;
|
return n.deviceID !== $scope.currentDevice.deviceID;
|
||||||
});
|
});
|
||||||
$scope.config.Devices = $scope.devices;
|
$scope.config.devices = $scope.devices;
|
||||||
// In case we later added the device manually, remove the ignoral
|
// In case we later added the device manually, remove the ignoral
|
||||||
// record.
|
// record.
|
||||||
$scope.config.IgnoredDevices = $scope.config.IgnoredDevices.filter(function (id) {
|
$scope.config.ignoredDevices = $scope.config.ignoredDevices.filter(function (id) {
|
||||||
return id !== $scope.currentDevice.DeviceID;
|
return id !== $scope.currentDevice.deviceID;
|
||||||
});
|
});
|
||||||
|
|
||||||
for (var id in $scope.folders) {
|
for (var id in $scope.folders) {
|
||||||
$scope.folders[id].Devices = $scope.folders[id].Devices.filter(function (n) {
|
$scope.folders[id].devices = $scope.folders[id].devices.filter(function (n) {
|
||||||
return n.DeviceID !== $scope.currentDevice.DeviceID;
|
return n.deviceID !== $scope.currentDevice.deviceID;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -756,10 +755,10 @@ angular.module('syncthing.core')
|
|||||||
|
|
||||||
$scope.addNewDeviceID = function (device) {
|
$scope.addNewDeviceID = function (device) {
|
||||||
var deviceCfg = {
|
var deviceCfg = {
|
||||||
DeviceID: device,
|
deviceID: device,
|
||||||
AddressesStr: 'dynamic',
|
addressesStr: 'dynamic',
|
||||||
Compression: 'metadata',
|
compression: 'metadata',
|
||||||
Introducer: false,
|
introducer: false,
|
||||||
selectedFolders: {}
|
selectedFolders: {}
|
||||||
};
|
};
|
||||||
$scope.saveDeviceConfig(deviceCfg);
|
$scope.saveDeviceConfig(deviceCfg);
|
||||||
@@ -768,13 +767,13 @@ angular.module('syncthing.core')
|
|||||||
|
|
||||||
$scope.saveDeviceConfig = function (deviceCfg) {
|
$scope.saveDeviceConfig = function (deviceCfg) {
|
||||||
var done, i;
|
var done, i;
|
||||||
deviceCfg.Addresses = deviceCfg.AddressesStr.split(',').map(function (x) {
|
deviceCfg.addresses = deviceCfg.addressesStr.split(',').map(function (x) {
|
||||||
return x.trim();
|
return x.trim();
|
||||||
});
|
});
|
||||||
|
|
||||||
done = false;
|
done = false;
|
||||||
for (i = 0; i < $scope.devices.length; i++) {
|
for (i = 0; i < $scope.devices.length; i++) {
|
||||||
if ($scope.devices[i].DeviceID === deviceCfg.DeviceID) {
|
if ($scope.devices[i].deviceID === deviceCfg.deviceID) {
|
||||||
$scope.devices[i] = deviceCfg;
|
$scope.devices[i] = deviceCfg;
|
||||||
done = true;
|
done = true;
|
||||||
break;
|
break;
|
||||||
@@ -786,32 +785,32 @@ angular.module('syncthing.core')
|
|||||||
}
|
}
|
||||||
|
|
||||||
$scope.devices.sort(deviceCompare);
|
$scope.devices.sort(deviceCompare);
|
||||||
$scope.config.Devices = $scope.devices;
|
$scope.config.devices = $scope.devices;
|
||||||
// In case we are adding the device manually, remove the ignoral
|
// In case we are adding the device manually, remove the ignoral
|
||||||
// record.
|
// record.
|
||||||
$scope.config.IgnoredDevices = $scope.config.IgnoredDevices.filter(function (id) {
|
$scope.config.ignoredDevices = $scope.config.ignoredDevices.filter(function (id) {
|
||||||
return id !== deviceCfg.DeviceID;
|
return id !== deviceCfg.deviceID;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!$scope.editingSelf) {
|
if (!$scope.editingSelf) {
|
||||||
for (var id in deviceCfg.selectedFolders) {
|
for (var id in deviceCfg.selectedFolders) {
|
||||||
if (deviceCfg.selectedFolders[id]) {
|
if (deviceCfg.selectedFolders[id]) {
|
||||||
var found = false;
|
var found = false;
|
||||||
for (i = 0; i < $scope.folders[id].Devices.length; i++) {
|
for (i = 0; i < $scope.folders[id].devices.length; i++) {
|
||||||
if ($scope.folders[id].Devices[i].DeviceID == deviceCfg.DeviceID) {
|
if ($scope.folders[id].devices[i].deviceID == deviceCfg.deviceID) {
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
$scope.folders[id].Devices.push({
|
$scope.folders[id].devices.push({
|
||||||
DeviceID: deviceCfg.DeviceID
|
deviceID: deviceCfg.deviceID
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$scope.folders[id].Devices = $scope.folders[id].Devices.filter(function (n) {
|
$scope.folders[id].devices = $scope.folders[id].devices.filter(function (n) {
|
||||||
return n.DeviceID != deviceCfg.DeviceID;
|
return n.deviceID != deviceCfg.deviceID;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -825,14 +824,14 @@ angular.module('syncthing.core')
|
|||||||
};
|
};
|
||||||
|
|
||||||
$scope.ignoreRejectedDevice = function (device) {
|
$scope.ignoreRejectedDevice = function (device) {
|
||||||
$scope.config.IgnoredDevices.push(device);
|
$scope.config.ignoredDevices.push(device);
|
||||||
$scope.saveConfig();
|
$scope.saveConfig();
|
||||||
$scope.dismissDeviceRejection(device);
|
$scope.dismissDeviceRejection(device);
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.otherDevices = function () {
|
$scope.otherDevices = function () {
|
||||||
return $scope.devices.filter(function (n) {
|
return $scope.devices.filter(function (n) {
|
||||||
return n.DeviceID !== $scope.myID;
|
return n.deviceID !== $scope.myID;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -841,7 +840,7 @@ angular.module('syncthing.core')
|
|||||||
|
|
||||||
for (i = 0; i < $scope.devices.length; i++) {
|
for (i = 0; i < $scope.devices.length; i++) {
|
||||||
n = $scope.devices[i];
|
n = $scope.devices[i];
|
||||||
if (n.DeviceID === $scope.myID) {
|
if (n.deviceID === $scope.myID) {
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -855,19 +854,19 @@ angular.module('syncthing.core')
|
|||||||
|
|
||||||
$scope.errorList = function () {
|
$scope.errorList = function () {
|
||||||
return $scope.errors.filter(function (e) {
|
return $scope.errors.filter(function (e) {
|
||||||
return e.Time > $scope.seenError;
|
return e.time > $scope.seenError;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.clearErrors = function () {
|
$scope.clearErrors = function () {
|
||||||
$scope.seenError = $scope.errors[$scope.errors.length - 1].Time;
|
$scope.seenError = $scope.errors[$scope.errors.length - 1].time;
|
||||||
$http.post(urlbase + '/error/clear');
|
$http.post(urlbase + '/error/clear');
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.friendlyDevices = function (str) {
|
$scope.friendlyDevices = function (str) {
|
||||||
for (var i = 0; i < $scope.devices.length; i++) {
|
for (var i = 0; i < $scope.devices.length; i++) {
|
||||||
var cfg = $scope.devices[i];
|
var cfg = $scope.devices[i];
|
||||||
str = str.replace(cfg.DeviceID, $scope.deviceName(cfg));
|
str = str.replace(cfg.deviceID, $scope.deviceName(cfg));
|
||||||
}
|
}
|
||||||
return str;
|
return str;
|
||||||
};
|
};
|
||||||
@@ -878,7 +877,7 @@ angular.module('syncthing.core')
|
|||||||
|
|
||||||
$scope.directoryList = [];
|
$scope.directoryList = [];
|
||||||
|
|
||||||
$scope.$watch('currentFolder.Path', function (newvalue) {
|
$scope.$watch('currentFolder.path', function (newvalue) {
|
||||||
$http.get(urlbase + '/autocomplete/directory', {
|
$http.get(urlbase + '/autocomplete/directory', {
|
||||||
params: { current: newvalue }
|
params: { current: newvalue }
|
||||||
}).success(function (data) {
|
}).success(function (data) {
|
||||||
@@ -888,25 +887,29 @@ angular.module('syncthing.core')
|
|||||||
|
|
||||||
$scope.editFolder = function (folderCfg) {
|
$scope.editFolder = function (folderCfg) {
|
||||||
$scope.currentFolder = angular.copy(folderCfg);
|
$scope.currentFolder = angular.copy(folderCfg);
|
||||||
if ($scope.currentFolder.Path.slice(-1) == $scope.system.pathSeparator) {
|
if ($scope.currentFolder.path.slice(-1) == $scope.system.pathSeparator) {
|
||||||
$scope.currentFolder.Path = $scope.currentFolder.Path.slice(0, -1);
|
$scope.currentFolder.path = $scope.currentFolder.path.slice(0, -1);
|
||||||
}
|
}
|
||||||
$scope.currentFolder.selectedDevices = {};
|
$scope.currentFolder.selectedDevices = {};
|
||||||
$scope.currentFolder.Devices.forEach(function (n) {
|
$scope.currentFolder.devices.forEach(function (n) {
|
||||||
$scope.currentFolder.selectedDevices[n.DeviceID] = true;
|
$scope.currentFolder.selectedDevices[n.deviceID] = true;
|
||||||
});
|
});
|
||||||
if ($scope.currentFolder.Versioning && $scope.currentFolder.Versioning.Type === "simple") {
|
if ($scope.currentFolder.versioning && $scope.currentFolder.versioning.type === "simple") {
|
||||||
$scope.currentFolder.simpleFileVersioning = true;
|
$scope.currentFolder.simpleFileVersioning = true;
|
||||||
$scope.currentFolder.FileVersioningSelector = "simple";
|
$scope.currentFolder.fileVersioningSelector = "simple";
|
||||||
$scope.currentFolder.simpleKeep = +$scope.currentFolder.Versioning.Params.keep;
|
$scope.currentFolder.simpleKeep = +$scope.currentFolder.versioning.params.keep;
|
||||||
} else if ($scope.currentFolder.Versioning && $scope.currentFolder.Versioning.Type === "staggered") {
|
} else if ($scope.currentFolder.versioning && $scope.currentFolder.versioning.type === "staggered") {
|
||||||
$scope.currentFolder.staggeredFileVersioning = true;
|
$scope.currentFolder.staggeredFileVersioning = true;
|
||||||
$scope.currentFolder.FileVersioningSelector = "staggered";
|
$scope.currentFolder.fileVersioningSelector = "staggered";
|
||||||
$scope.currentFolder.staggeredMaxAge = Math.floor(+$scope.currentFolder.Versioning.Params.maxAge / 86400);
|
$scope.currentFolder.staggeredMaxAge = Math.floor(+$scope.currentFolder.versioning.params.maxAge / 86400);
|
||||||
$scope.currentFolder.staggeredCleanInterval = +$scope.currentFolder.Versioning.Params.cleanInterval;
|
$scope.currentFolder.staggeredCleanInterval = +$scope.currentFolder.versioning.params.cleanInterval;
|
||||||
$scope.currentFolder.staggeredVersionsPath = $scope.currentFolder.Versioning.Params.versionsPath;
|
$scope.currentFolder.staggeredVersionsPath = $scope.currentFolder.versioning.params.versionsPath;
|
||||||
|
} else if ($scope.currentFolder.versioning && $scope.currentFolder.versioning.type === "external") {
|
||||||
|
$scope.currentFolder.externalFileVersioning = true;
|
||||||
|
$scope.currentFolder.fileVersioningSelector = "external";
|
||||||
|
$scope.currentFolder.externalCommand = $scope.currentFolder.versioning.params.command;
|
||||||
} else {
|
} else {
|
||||||
$scope.currentFolder.FileVersioningSelector = "none";
|
$scope.currentFolder.fileVersioningSelector = "none";
|
||||||
}
|
}
|
||||||
$scope.currentFolder.simpleKeep = $scope.currentFolder.simpleKeep || 5;
|
$scope.currentFolder.simpleKeep = $scope.currentFolder.simpleKeep || 5;
|
||||||
$scope.currentFolder.staggeredCleanInterval = $scope.currentFolder.staggeredCleanInterval || 3600;
|
$scope.currentFolder.staggeredCleanInterval = $scope.currentFolder.staggeredCleanInterval || 3600;
|
||||||
@@ -918,6 +921,7 @@ angular.module('syncthing.core')
|
|||||||
if (typeof $scope.currentFolder.staggeredMaxAge === 'undefined') {
|
if (typeof $scope.currentFolder.staggeredMaxAge === 'undefined') {
|
||||||
$scope.currentFolder.staggeredMaxAge = 365;
|
$scope.currentFolder.staggeredMaxAge = 365;
|
||||||
}
|
}
|
||||||
|
$scope.currentFolder.externalCommand = $scope.currentFolder.externalCommand || "";
|
||||||
|
|
||||||
$scope.editingExisting = true;
|
$scope.editingExisting = true;
|
||||||
$scope.folderEditor.$setPristine();
|
$scope.folderEditor.$setPristine();
|
||||||
@@ -928,12 +932,14 @@ angular.module('syncthing.core')
|
|||||||
$scope.currentFolder = {
|
$scope.currentFolder = {
|
||||||
selectedDevices: {}
|
selectedDevices: {}
|
||||||
};
|
};
|
||||||
$scope.currentFolder.RescanIntervalS = 60;
|
$scope.currentFolder.rescanIntervalS = 60;
|
||||||
$scope.currentFolder.FileVersioningSelector = "none";
|
$scope.currentFolder.fileVersioningSelector = "none";
|
||||||
$scope.currentFolder.simpleKeep = 5;
|
$scope.currentFolder.simpleKeep = 5;
|
||||||
$scope.currentFolder.staggeredMaxAge = 365;
|
$scope.currentFolder.staggeredMaxAge = 365;
|
||||||
$scope.currentFolder.staggeredCleanInterval = 3600;
|
$scope.currentFolder.staggeredCleanInterval = 3600;
|
||||||
$scope.currentFolder.staggeredVersionsPath = "";
|
$scope.currentFolder.staggeredVersionsPath = "";
|
||||||
|
$scope.currentFolder.externalCommand = "";
|
||||||
|
$scope.currentFolder.autoNormalize = true;
|
||||||
$scope.editingExisting = false;
|
$scope.editingExisting = false;
|
||||||
$scope.folderEditor.$setPristine();
|
$scope.folderEditor.$setPristine();
|
||||||
$('#editFolder').modal();
|
$('#editFolder').modal();
|
||||||
@@ -947,22 +953,24 @@ angular.module('syncthing.core')
|
|||||||
};
|
};
|
||||||
$scope.currentFolder.selectedDevices[device] = true;
|
$scope.currentFolder.selectedDevices[device] = true;
|
||||||
|
|
||||||
$scope.currentFolder.RescanIntervalS = 60;
|
$scope.currentFolder.rescanIntervalS = 60;
|
||||||
$scope.currentFolder.FileVersioningSelector = "none";
|
$scope.currentFolder.fileVersioningSelector = "none";
|
||||||
$scope.currentFolder.simpleKeep = 5;
|
$scope.currentFolder.simpleKeep = 5;
|
||||||
$scope.currentFolder.staggeredMaxAge = 365;
|
$scope.currentFolder.staggeredMaxAge = 365;
|
||||||
$scope.currentFolder.staggeredCleanInterval = 3600;
|
$scope.currentFolder.staggeredCleanInterval = 3600;
|
||||||
$scope.currentFolder.staggeredVersionsPath = "";
|
$scope.currentFolder.staggeredVersionsPath = "";
|
||||||
|
$scope.currentFolder.externalCommand = "";
|
||||||
|
$scope.currentFolder.autoNormalize = true;
|
||||||
$scope.editingExisting = false;
|
$scope.editingExisting = false;
|
||||||
$scope.folderEditor.$setPristine();
|
$scope.folderEditor.$setPristine();
|
||||||
$('#editFolder').modal();
|
$('#editFolder').modal();
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.shareFolderWithDevice = function (folder, device) {
|
$scope.shareFolderWithDevice = function (folder, device) {
|
||||||
$scope.folders[folder].Devices.push({
|
$scope.folders[folder].devices.push({
|
||||||
DeviceID: device
|
deviceID: device
|
||||||
});
|
});
|
||||||
$scope.config.Folders = folderList($scope.folders);
|
$scope.config.folders = folderList($scope.folders);
|
||||||
$scope.saveConfig();
|
$scope.saveConfig();
|
||||||
$scope.dismissFolderRejection(folder, device);
|
$scope.dismissFolderRejection(folder, device);
|
||||||
};
|
};
|
||||||
@@ -972,19 +980,19 @@ angular.module('syncthing.core')
|
|||||||
|
|
||||||
$('#editFolder').modal('hide');
|
$('#editFolder').modal('hide');
|
||||||
folderCfg = $scope.currentFolder;
|
folderCfg = $scope.currentFolder;
|
||||||
folderCfg.Devices = [];
|
folderCfg.devices = [];
|
||||||
folderCfg.selectedDevices[$scope.myID] = true;
|
folderCfg.selectedDevices[$scope.myID] = true;
|
||||||
for (var deviceID in folderCfg.selectedDevices) {
|
for (var deviceID in folderCfg.selectedDevices) {
|
||||||
if (folderCfg.selectedDevices[deviceID] === true) {
|
if (folderCfg.selectedDevices[deviceID] === true) {
|
||||||
folderCfg.Devices.push({
|
folderCfg.devices.push({
|
||||||
DeviceID: deviceID
|
deviceID: deviceID
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete folderCfg.selectedDevices;
|
delete folderCfg.selectedDevices;
|
||||||
|
|
||||||
if (folderCfg.FileVersioningSelector === "simple") {
|
if (folderCfg.fileVersioningSelector === "simple") {
|
||||||
folderCfg.Versioning = {
|
folderCfg.versioning = {
|
||||||
'Type': 'simple',
|
'Type': 'simple',
|
||||||
'Params': {
|
'Params': {
|
||||||
'keep': '' + folderCfg.simpleKeep
|
'keep': '' + folderCfg.simpleKeep
|
||||||
@@ -992,10 +1000,10 @@ angular.module('syncthing.core')
|
|||||||
};
|
};
|
||||||
delete folderCfg.simpleFileVersioning;
|
delete folderCfg.simpleFileVersioning;
|
||||||
delete folderCfg.simpleKeep;
|
delete folderCfg.simpleKeep;
|
||||||
} else if (folderCfg.FileVersioningSelector === "staggered") {
|
} else if (folderCfg.fileVersioningSelector === "staggered") {
|
||||||
folderCfg.Versioning = {
|
folderCfg.versioning = {
|
||||||
'Type': 'staggered',
|
'type': 'staggered',
|
||||||
'Params': {
|
'params': {
|
||||||
'maxAge': '' + (folderCfg.staggeredMaxAge * 86400),
|
'maxAge': '' + (folderCfg.staggeredMaxAge * 86400),
|
||||||
'cleanInterval': '' + folderCfg.staggeredCleanInterval,
|
'cleanInterval': '' + folderCfg.staggeredCleanInterval,
|
||||||
'versionsPath': '' + folderCfg.staggeredVersionsPath
|
'versionsPath': '' + folderCfg.staggeredVersionsPath
|
||||||
@@ -1006,12 +1014,21 @@ angular.module('syncthing.core')
|
|||||||
delete folderCfg.staggeredCleanInterval;
|
delete folderCfg.staggeredCleanInterval;
|
||||||
delete folderCfg.staggeredVersionsPath;
|
delete folderCfg.staggeredVersionsPath;
|
||||||
|
|
||||||
|
} else if (folderCfg.fileVersioningSelector === "external") {
|
||||||
|
folderCfg.versioning = {
|
||||||
|
'Type': 'external',
|
||||||
|
'Params': {
|
||||||
|
'command': '' + folderCfg.externalCommand
|
||||||
|
}
|
||||||
|
};
|
||||||
|
delete folderCfg.externalFileVersioning;
|
||||||
|
delete folderCfg.externalCommand;
|
||||||
} else {
|
} else {
|
||||||
delete folderCfg.Versioning;
|
delete folderCfg.versioning;
|
||||||
}
|
}
|
||||||
|
|
||||||
$scope.folders[folderCfg.ID] = folderCfg;
|
$scope.folders[folderCfg.id] = folderCfg;
|
||||||
$scope.config.Folders = folderList($scope.folders);
|
$scope.config.folders = folderList($scope.folders);
|
||||||
|
|
||||||
$scope.saveConfig();
|
$scope.saveConfig();
|
||||||
};
|
};
|
||||||
@@ -1022,9 +1039,9 @@ angular.module('syncthing.core')
|
|||||||
|
|
||||||
$scope.sharesFolder = function (folderCfg) {
|
$scope.sharesFolder = function (folderCfg) {
|
||||||
var names = [];
|
var names = [];
|
||||||
folderCfg.Devices.forEach(function (device) {
|
folderCfg.devices.forEach(function (device) {
|
||||||
if (device.DeviceID != $scope.myID) {
|
if (device.deviceID != $scope.myID) {
|
||||||
names.push($scope.deviceName($scope.findDevice(device.DeviceID)));
|
names.push($scope.deviceName($scope.findDevice(device.deviceID)));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
names.sort();
|
names.sort();
|
||||||
@@ -1034,9 +1051,9 @@ angular.module('syncthing.core')
|
|||||||
$scope.deviceFolders = function (deviceCfg) {
|
$scope.deviceFolders = function (deviceCfg) {
|
||||||
var folders = [];
|
var folders = [];
|
||||||
for (var folderID in $scope.folders) {
|
for (var folderID in $scope.folders) {
|
||||||
var devices = $scope.folders[folderID].Devices
|
var devices = $scope.folders[folderID].devices
|
||||||
for (var i = 0; i < devices.length; i++) {
|
for (var i = 0; i < devices.length; i++) {
|
||||||
if (devices[i].DeviceID == deviceCfg.DeviceID) {
|
if (devices[i].deviceID == deviceCfg.deviceID) {
|
||||||
folders.push(folderID);
|
folders.push(folderID);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1053,8 +1070,8 @@ angular.module('syncthing.core')
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete $scope.folders[$scope.currentFolder.ID];
|
delete $scope.folders[$scope.currentFolder.id];
|
||||||
$scope.config.Folders = folderList($scope.folders);
|
$scope.config.folders = folderList($scope.folders);
|
||||||
|
|
||||||
$scope.saveConfig();
|
$scope.saveConfig();
|
||||||
};
|
};
|
||||||
@@ -1065,7 +1082,7 @@ angular.module('syncthing.core')
|
|||||||
}
|
}
|
||||||
|
|
||||||
$('#editIgnoresButton').attr('disabled', 'disabled');
|
$('#editIgnoresButton').attr('disabled', 'disabled');
|
||||||
$http.get(urlbase + '/ignores?folder=' + encodeURIComponent($scope.currentFolder.ID))
|
$http.get(urlbase + '/ignores?folder=' + encodeURIComponent($scope.currentFolder.id))
|
||||||
.success(function (data) {
|
.success(function (data) {
|
||||||
data.ignore = data.ignore || [];
|
data.ignore = data.ignore || [];
|
||||||
|
|
||||||
@@ -1092,13 +1109,13 @@ angular.module('syncthing.core')
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$http.post(urlbase + '/ignores?folder=' + encodeURIComponent($scope.currentFolder.ID), {
|
$http.post(urlbase + '/ignores?folder=' + encodeURIComponent($scope.currentFolder.id), {
|
||||||
ignore: $('#editIgnores textarea').val().split('\n')
|
ignore: $('#editIgnores textarea').val().split('\n')
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.setAPIKey = function (cfg) {
|
$scope.setAPIKey = function (cfg) {
|
||||||
cfg.APIKey = randomString(32);
|
cfg.apiKey = randomString(32);
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.showURPreview = function () {
|
$scope.showURPreview = function () {
|
||||||
@@ -1109,13 +1126,13 @@ angular.module('syncthing.core')
|
|||||||
};
|
};
|
||||||
|
|
||||||
$scope.acceptUR = function () {
|
$scope.acceptUR = function () {
|
||||||
$scope.config.Options.URAccepted = 1000; // Larger than the largest existing report version
|
$scope.config.options.urAccepted = 1000; // Larger than the largest existing report version
|
||||||
$scope.saveConfig();
|
$scope.saveConfig();
|
||||||
$('#ur').modal('hide');
|
$('#ur').modal('hide');
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.declineUR = function () {
|
$scope.declineUR = function () {
|
||||||
$scope.config.Options.URAccepted = -1;
|
$scope.config.options.urAccepted = -1;
|
||||||
$scope.saveConfig();
|
$scope.saveConfig();
|
||||||
$('#ur').modal('hide');
|
$('#ur').modal('hide');
|
||||||
};
|
};
|
||||||
@@ -1133,11 +1150,11 @@ angular.module('syncthing.core')
|
|||||||
var fDelete = 4096;
|
var fDelete = 4096;
|
||||||
var fDirectory = 16384;
|
var fDirectory = 16384;
|
||||||
|
|
||||||
if ((file.Flags & (fDelete + fDirectory)) === fDelete + fDirectory) {
|
if ((file.flags & (fDelete + fDirectory)) === fDelete + fDirectory) {
|
||||||
return 'rmdir';
|
return 'rmdir';
|
||||||
} else if ((file.Flags & fDelete) === fDelete) {
|
} else if ((file.flags & fDelete) === fDelete) {
|
||||||
return 'rm';
|
return 'rm';
|
||||||
} else if ((file.Flags & fDirectory) === fDirectory) {
|
} else if ((file.flags & fDirectory) === fDirectory) {
|
||||||
return 'touch';
|
return 'touch';
|
||||||
} else {
|
} else {
|
||||||
return 'sync';
|
return 'sync';
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package auto_test
|
package auto_test
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// Package auto contains auto generated files for web assets.
|
// Package auto contains auto generated files for web assets.
|
||||||
package auto
|
package auto
|
||||||
|
|||||||
+13
-18
File diff suppressed because one or more lines are too long
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package beacon
|
package beacon
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package beacon
|
package beacon
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package beacon
|
package beacon
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package beacon
|
package beacon
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// Package beacon implements an UDP broadcast beacon
|
// Package beacon implements an UDP broadcast beacon
|
||||||
package beacon
|
package beacon
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package beacon
|
package beacon
|
||||||
|
|
||||||
|
|||||||
+71
-68
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// Package config implements reading and writing of the syncthing configuration file.
|
// Package config implements reading and writing of the syncthing configuration file.
|
||||||
package config
|
package config
|
||||||
@@ -36,15 +27,15 @@ import (
|
|||||||
|
|
||||||
var l = logger.DefaultLogger
|
var l = logger.DefaultLogger
|
||||||
|
|
||||||
const CurrentVersion = 9
|
const CurrentVersion = 10
|
||||||
|
|
||||||
type Configuration struct {
|
type Configuration struct {
|
||||||
Version int `xml:"version,attr"`
|
Version int `xml:"version,attr" json:"version"`
|
||||||
Folders []FolderConfiguration `xml:"folder"`
|
Folders []FolderConfiguration `xml:"folder" json:"folders"`
|
||||||
Devices []DeviceConfiguration `xml:"device"`
|
Devices []DeviceConfiguration `xml:"device" json:"devices"`
|
||||||
GUI GUIConfiguration `xml:"gui"`
|
GUI GUIConfiguration `xml:"gui" json:"gui"`
|
||||||
Options OptionsConfiguration `xml:"options"`
|
Options OptionsConfiguration `xml:"options" json:"options"`
|
||||||
IgnoredDevices []protocol.DeviceID `xml:"ignoredDevice"`
|
IgnoredDevices []protocol.DeviceID `xml:"ignoredDevice" json:"ignoredDevices"`
|
||||||
XMLName xml.Name `xml:"configuration" json:"-"`
|
XMLName xml.Name `xml:"configuration" json:"-"`
|
||||||
|
|
||||||
OriginalVersion int `xml:"-" json:"-"` // The version we read from disk, before any conversion
|
OriginalVersion int `xml:"-" json:"-"` // The version we read from disk, before any conversion
|
||||||
@@ -53,19 +44,20 @@ type Configuration struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type FolderConfiguration struct {
|
type FolderConfiguration struct {
|
||||||
ID string `xml:"id,attr"`
|
ID string `xml:"id,attr" json:"id"`
|
||||||
Path string `xml:"path,attr"`
|
Path string `xml:"path,attr" json:"path"`
|
||||||
Devices []FolderDeviceConfiguration `xml:"device"`
|
Devices []FolderDeviceConfiguration `xml:"device" json:"devices"`
|
||||||
ReadOnly bool `xml:"ro,attr"`
|
ReadOnly bool `xml:"ro,attr" json:"readOnly"`
|
||||||
RescanIntervalS int `xml:"rescanIntervalS,attr" default:"60"`
|
RescanIntervalS int `xml:"rescanIntervalS,attr" json:"rescanIntervalS"`
|
||||||
IgnorePerms bool `xml:"ignorePerms,attr"`
|
IgnorePerms bool `xml:"ignorePerms,attr" json:"ignorePerms"`
|
||||||
Versioning VersioningConfiguration `xml:"versioning"`
|
AutoNormalize bool `xml:"autoNormalize,attr" json:"autoNormalize"`
|
||||||
LenientMtimes bool `xml:"lenientMtimes"`
|
Versioning VersioningConfiguration `xml:"versioning" json:"versioning"`
|
||||||
Copiers int `xml:"copiers" default:"1"` // This defines how many files are handled concurrently.
|
LenientMtimes bool `xml:"lenientMtimes" json:"lenientMTimes"`
|
||||||
Pullers int `xml:"pullers" default:"16"` // Defines how many blocks are fetched at the same time, possibly between separate copier routines.
|
Copiers int `xml:"copiers" json:"copiers"` // This defines how many files are handled concurrently.
|
||||||
Hashers int `xml:"hashers" default:"0"` // Less than one sets the value to the number of cores. These are CPU bound due to hashing.
|
Pullers int `xml:"pullers" json:"pullers"` // Defines how many blocks are fetched at the same time, possibly between separate copier routines.
|
||||||
|
Hashers int `xml:"hashers" json:"hashers"` // Less than one sets the value to the number of cores. These are CPU bound due to hashing.
|
||||||
|
|
||||||
Invalid string `xml:"-"` // Set at runtime when there is an error, not saved
|
Invalid string `xml:"-" json:"invalid"` // Set at runtime when there is an error, not saved
|
||||||
|
|
||||||
deviceIDs []protocol.DeviceID
|
deviceIDs []protocol.DeviceID
|
||||||
|
|
||||||
@@ -105,8 +97,8 @@ func (f *FolderConfiguration) DeviceIDs() []protocol.DeviceID {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type VersioningConfiguration struct {
|
type VersioningConfiguration struct {
|
||||||
Type string `xml:"type,attr"`
|
Type string `xml:"type,attr" json:"type"`
|
||||||
Params map[string]string
|
Params map[string]string `json:"params"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type InternalVersioningConfiguration struct {
|
type InternalVersioningConfiguration struct {
|
||||||
@@ -146,44 +138,44 @@ func (c *VersioningConfiguration) UnmarshalXML(d *xml.Decoder, start xml.StartEl
|
|||||||
}
|
}
|
||||||
|
|
||||||
type DeviceConfiguration struct {
|
type DeviceConfiguration struct {
|
||||||
DeviceID protocol.DeviceID `xml:"id,attr"`
|
DeviceID protocol.DeviceID `xml:"id,attr" json:"deviceID"`
|
||||||
Name string `xml:"name,attr,omitempty"`
|
Name string `xml:"name,attr,omitempty" json:"name"`
|
||||||
Addresses []string `xml:"address,omitempty"`
|
Addresses []string `xml:"address,omitempty" json:"addresses"`
|
||||||
Compression protocol.Compression `xml:"compression,attr"`
|
Compression protocol.Compression `xml:"compression,attr" json:"compression"`
|
||||||
CertName string `xml:"certName,attr,omitempty"`
|
CertName string `xml:"certName,attr,omitempty" json:"certName"`
|
||||||
Introducer bool `xml:"introducer,attr"`
|
Introducer bool `xml:"introducer,attr" json:"introducer"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type FolderDeviceConfiguration struct {
|
type FolderDeviceConfiguration struct {
|
||||||
DeviceID protocol.DeviceID `xml:"id,attr"`
|
DeviceID protocol.DeviceID `xml:"id,attr" json:"deviceID"`
|
||||||
|
|
||||||
Deprecated_Name string `xml:"name,attr,omitempty" json:"-"`
|
Deprecated_Name string `xml:"name,attr,omitempty" json:"-"`
|
||||||
Deprecated_Addresses []string `xml:"address,omitempty" json:"-"`
|
Deprecated_Addresses []string `xml:"address,omitempty" json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type OptionsConfiguration struct {
|
type OptionsConfiguration struct {
|
||||||
ListenAddress []string `xml:"listenAddress" default:"0.0.0.0:22000"`
|
ListenAddress []string `xml:"listenAddress" json:"listenAddress" default:"0.0.0.0:22000"`
|
||||||
GlobalAnnServers []string `xml:"globalAnnounceServer" default:"udp4://announce.syncthing.net:22026, udp6://announce-v6.syncthing.net:22026"`
|
GlobalAnnServers []string `xml:"globalAnnounceServer" json:"globalAnnounceServers" json:"globalAnnounceServer" default:"udp4://announce.syncthing.net:22026, udp6://announce-v6.syncthing.net:22026"`
|
||||||
GlobalAnnEnabled bool `xml:"globalAnnounceEnabled" default:"true"`
|
GlobalAnnEnabled bool `xml:"globalAnnounceEnabled" json:"globalAnnounceEnabled" default:"true"`
|
||||||
LocalAnnEnabled bool `xml:"localAnnounceEnabled" default:"true"`
|
LocalAnnEnabled bool `xml:"localAnnounceEnabled" json:"localAnnounceEnabled" default:"true"`
|
||||||
LocalAnnPort int `xml:"localAnnouncePort" default:"21025"`
|
LocalAnnPort int `xml:"localAnnouncePort" json:"localAnnouncePort" default:"21025"`
|
||||||
LocalAnnMCAddr string `xml:"localAnnounceMCAddr" default:"[ff32::5222]:21026"`
|
LocalAnnMCAddr string `xml:"localAnnounceMCAddr" json:"localAnnounceMCAddr" default:"[ff32::5222]:21026"`
|
||||||
MaxSendKbps int `xml:"maxSendKbps"`
|
MaxSendKbps int `xml:"maxSendKbps" json:"maxSendKbps"`
|
||||||
MaxRecvKbps int `xml:"maxRecvKbps"`
|
MaxRecvKbps int `xml:"maxRecvKbps" json:"maxRecvKbps"`
|
||||||
ReconnectIntervalS int `xml:"reconnectionIntervalS" default:"60"`
|
ReconnectIntervalS int `xml:"reconnectionIntervalS" json:"reconnectionIntervalS" default:"60"`
|
||||||
StartBrowser bool `xml:"startBrowser" default:"true"`
|
StartBrowser bool `xml:"startBrowser" json:"startBrowser" default:"true"`
|
||||||
UPnPEnabled bool `xml:"upnpEnabled" default:"true"`
|
UPnPEnabled bool `xml:"upnpEnabled" json:"upnpEnabled" default:"true"`
|
||||||
UPnPLease int `xml:"upnpLeaseMinutes" default:"0"`
|
UPnPLease int `xml:"upnpLeaseMinutes" json:"upnpLeaseMinutes" default:"0"`
|
||||||
UPnPRenewal int `xml:"upnpRenewalMinutes" default:"30"`
|
UPnPRenewal int `xml:"upnpRenewalMinutes" json:"upnpRenewalMinutes" default:"30"`
|
||||||
URAccepted int `xml:"urAccepted"` // Accepted usage reporting version; 0 for off (undecided), -1 for off (permanently)
|
URAccepted int `xml:"urAccepted" json:"urAccepted"` // Accepted usage reporting version; 0 for off (undecided), -1 for off (permanently)
|
||||||
URUniqueID string `xml:"urUniqueID"` // Unique ID for reporting purposes, regenerated when UR is turned on.
|
URUniqueID string `xml:"urUniqueID" json:"urUniqueId"` // Unique ID for reporting purposes, regenerated when UR is turned on.
|
||||||
RestartOnWakeup bool `xml:"restartOnWakeup" default:"true"`
|
RestartOnWakeup bool `xml:"restartOnWakeup" json:"restartOnWakeup" default:"true"`
|
||||||
AutoUpgradeIntervalH int `xml:"autoUpgradeIntervalH" default:"12"` // 0 for off
|
AutoUpgradeIntervalH int `xml:"autoUpgradeIntervalH" json:"autoUpgradeIntervalH" default:"12"` // 0 for off
|
||||||
KeepTemporariesH int `xml:"keepTemporariesH" default:"24"` // 0 for off
|
KeepTemporariesH int `xml:"keepTemporariesH" json:"keepTemporariesH" default:"24"` // 0 for off
|
||||||
CacheIgnoredFiles bool `xml:"cacheIgnoredFiles" default:"true"`
|
CacheIgnoredFiles bool `xml:"cacheIgnoredFiles" json:"cacheIgnoredFiles" default:"true"`
|
||||||
ProgressUpdateIntervalS int `xml:"progressUpdateIntervalS" default:"5"`
|
ProgressUpdateIntervalS int `xml:"progressUpdateIntervalS" json:"progressUpdateIntervalS" default:"5"`
|
||||||
SymlinksEnabled bool `xml:"symlinksEnabled" default:"true"`
|
SymlinksEnabled bool `xml:"symlinksEnabled" json:"symlinksEnabled" default:"true"`
|
||||||
LimitBandwidthInLan bool `xml:"limitBandwidthInLan" default:"false"`
|
LimitBandwidthInLan bool `xml:"limitBandwidthInLan" json:"limitBandwidthInLan" default:"false"`
|
||||||
|
|
||||||
Deprecated_RescanIntervalS int `xml:"rescanIntervalS,omitempty" json:"-"`
|
Deprecated_RescanIntervalS int `xml:"rescanIntervalS,omitempty" json:"-"`
|
||||||
Deprecated_UREnabled bool `xml:"urEnabled,omitempty" json:"-"`
|
Deprecated_UREnabled bool `xml:"urEnabled,omitempty" json:"-"`
|
||||||
@@ -194,12 +186,12 @@ type OptionsConfiguration struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type GUIConfiguration struct {
|
type GUIConfiguration struct {
|
||||||
Enabled bool `xml:"enabled,attr" default:"true"`
|
Enabled bool `xml:"enabled,attr" json:"enabled" default:"true"`
|
||||||
Address string `xml:"address" default:"127.0.0.1:8080"`
|
Address string `xml:"address" json:"address" default:"127.0.0.1:8080"`
|
||||||
User string `xml:"user,omitempty"`
|
User string `xml:"user,omitempty" json:"user"`
|
||||||
Password string `xml:"password,omitempty"`
|
Password string `xml:"password,omitempty" json:"password"`
|
||||||
UseTLS bool `xml:"tls,attr"`
|
UseTLS bool `xml:"tls,attr" json:"useTLS"`
|
||||||
APIKey string `xml:"apikey,omitempty"`
|
APIKey string `xml:"apikey,omitempty" json:"apiKey"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(myID protocol.DeviceID) Configuration {
|
func New(myID protocol.DeviceID) Configuration {
|
||||||
@@ -323,6 +315,9 @@ func (cfg *Configuration) prepare(myID protocol.DeviceID) {
|
|||||||
if cfg.Version == 8 {
|
if cfg.Version == 8 {
|
||||||
convertV8V9(cfg)
|
convertV8V9(cfg)
|
||||||
}
|
}
|
||||||
|
if cfg.Version == 9 {
|
||||||
|
convertV9V10(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
// Hash old cleartext passwords
|
// Hash old cleartext passwords
|
||||||
if len(cfg.GUI.Password) > 0 && cfg.GUI.Password[0] != '$' {
|
if len(cfg.GUI.Password) > 0 && cfg.GUI.Password[0] != '$' {
|
||||||
@@ -414,6 +409,14 @@ func ChangeRequiresRestart(from, to Configuration) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func convertV9V10(cfg *Configuration) {
|
||||||
|
// Enable auto normalization on existing folders.
|
||||||
|
for i := range cfg.Folders {
|
||||||
|
cfg.Folders[i].AutoNormalize = true
|
||||||
|
}
|
||||||
|
cfg.Version = 10
|
||||||
|
}
|
||||||
|
|
||||||
func convertV8V9(cfg *Configuration) {
|
func convertV8V9(cfg *Configuration) {
|
||||||
// Compression is interpreted and serialized differently, but no enforced
|
// Compression is interpreted and serialized differently, but no enforced
|
||||||
// changes. Still need a new version number since the compression stuff
|
// changes. Still need a new version number since the compression stuff
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package config
|
package config
|
||||||
|
|
||||||
@@ -92,6 +83,7 @@ func TestDeviceConfig(t *testing.T) {
|
|||||||
Copiers: 1,
|
Copiers: 1,
|
||||||
Pullers: 16,
|
Pullers: 16,
|
||||||
Hashers: 0,
|
Hashers: 0,
|
||||||
|
AutoNormalize: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
expectedDevices := []DeviceConfiguration{
|
expectedDevices := []DeviceConfiguration{
|
||||||
|
|||||||
Vendored
+12
@@ -0,0 +1,12 @@
|
|||||||
|
<configuration version="10">
|
||||||
|
<folder id="test" path="testdata" ro="true" ignorePerms="false" rescanIntervalS="600" autoNormalize="true">
|
||||||
|
<device id="AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR"></device>
|
||||||
|
<device id="P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2"></device>
|
||||||
|
</folder>
|
||||||
|
<device id="AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR" name="node one" compression="metadata">
|
||||||
|
<address>a</address>
|
||||||
|
</device>
|
||||||
|
<device id="P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2" name="node two" compression="metadata">
|
||||||
|
<address>b</address>
|
||||||
|
</device>
|
||||||
|
</configuration>
|
||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package config
|
package config
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// Package db provides a set type to track local/remote files with newness
|
// Package db provides a set type to track local/remote files with newness
|
||||||
// checks. We must do a certain amount of normalization in here. We will get
|
// checks. We must do a certain amount of normalization in here. We will get
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package db
|
package db
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package db_test
|
package db_test
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package db
|
package db
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
//go:generate -command genxdr go run ../../Godeps/_workspace/src/github.com/calmh/xdr/cmd/genxdr/main.go
|
//go:generate -command genxdr go run ../../Godeps/_workspace/src/github.com/calmh/xdr/cmd/genxdr/main.go
|
||||||
//go:generate genxdr -o leveldb_xdr.go leveldb.go
|
//go:generate genxdr -o leveldb_xdr.go leveldb.go
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package db
|
package db
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package db
|
package db
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package db
|
package db
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// Package db provides a set type to track local/remote files with newness
|
// Package db provides a set type to track local/remote files with newness
|
||||||
// checks. We must do a certain amount of normalization in here. We will get
|
// checks. We must do a certain amount of normalization in here. We will get
|
||||||
|
|||||||
+3
-12
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package db_test
|
package db_test
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package db
|
package db
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package discover
|
package discover
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package discover
|
package discover
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package discover
|
package discover
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package discover
|
package discover
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package discover
|
package discover
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package discover
|
package discover
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// Package discover implements the device discovery protocol.
|
// Package discover implements the device discovery protocol.
|
||||||
package discover
|
package discover
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
//go:generate -command genxdr go run ../../Godeps/_workspace/src/github.com/calmh/xdr/cmd/genxdr/main.go
|
//go:generate -command genxdr go run ../../Godeps/_workspace/src/github.com/calmh/xdr/cmd/genxdr/main.go
|
||||||
//go:generate genxdr -o packets_xdr.go packets.go
|
//go:generate genxdr -o packets_xdr.go packets.go
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package events
|
package events
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// Package events provides event subscription and polling functionality.
|
// Package events provides event subscription and polling functionality.
|
||||||
package events
|
package events
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package events_test
|
package events_test
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package fnmatch
|
package fnmatch
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package fnmatch
|
package fnmatch
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package ignore
|
package ignore
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package ignore
|
package ignore
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package ignore
|
package ignore
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
// Copyright (C) 2014 The Syncthing Authors.
|
// Copyright (C) 2014 The Syncthing Authors.
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify it
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
// under the terms of the GNU General Public License as published by the Free
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
// Software Foundation, either version 3 of the License, or (at your option)
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
// any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
// more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License along
|
|
||||||
// with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
package ignore
|
package ignore
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user