Merge pull request #1484 from alex2108/master

Add external versioner (ref #573)
This commit is contained in:
Jakob Borg committed 2015-03-19 13:08:54 +01:00
commit 1f006481ee
6 files changed
+134 -15

No files matched your search

+15
View File
@@ -237,6 +237,7 @@
<td class="text-right" ng-switch="folder.Versioning.Type">
<span ng-switch-when="staggered" translate>Staggered File Versioning</span>
<span ng-switch-when="simple" translate>Simple File Versioning</span>
<span ng-switch-when="external" translate>External File Versioning</span>
</td>
</tr>
<tr>
@@ -620,6 +621,11 @@
<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>
</div>
</div>
<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>
@@ -646,6 +652,15 @@
<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>
</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>
@@ -904,6 +904,10 @@ angular.module('syncthing.core')
$scope.currentFolder.staggeredMaxAge = Math.floor(+$scope.currentFolder.versioning.params.maxAge / 86400);
$scope.currentFolder.staggeredCleanInterval = +$scope.currentFolder.versioning.params.cleanInterval;
$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 {
$scope.currentFolder.fileVersioningSelector = "none";
}
@@ -917,7 +921,8 @@ angular.module('syncthing.core')
if (typeof $scope.currentFolder.staggeredMaxAge === 'undefined') {
$scope.currentFolder.staggeredMaxAge = 365;
}
$scope.currentFolder.externalCommand = $scope.currentFolder.externalCommand || "";
$scope.editingExisting = true;
$scope.folderEditor.$setPristine();
$('#editFolder').modal();
@@ -933,6 +938,7 @@ angular.module('syncthing.core')
$scope.currentFolder.staggeredMaxAge = 365;
$scope.currentFolder.staggeredCleanInterval = 3600;
$scope.currentFolder.staggeredVersionsPath = "";
$scope.currentFolder.externalCommand = "";
$scope.editingExisting = false;
$scope.folderEditor.$setPristine();
$('#editFolder').modal();
@@ -952,6 +958,7 @@ angular.module('syncthing.core')
$scope.currentFolder.staggeredMaxAge = 365;
$scope.currentFolder.staggeredCleanInterval = 3600;
$scope.currentFolder.staggeredVersionsPath = "";
$scope.currentFolder.externalCommand = "";
$scope.editingExisting = false;
$scope.folderEditor.$setPristine();
$('#editFolder').modal();
@@ -1005,6 +1012,15 @@ angular.module('syncthing.core')
delete folderCfg.staggeredCleanInterval;
delete folderCfg.staggeredVersionsPath;
} else if (folderCfg.fileVersioningSelector === "external") {
folderCfg.versioning = {
'Type': 'external',
'Params': {
'command': '' + folderCfg.externalCommand
}
};
delete folderCfg.externalFileVersioning;
delete folderCfg.externalCommand;
} else {
delete folderCfg.versioning;
}
+2 -2
View File
@@ -172,7 +172,7 @@ func Assets() map[string][]byte {
bs, _ = ioutil.ReadAll(gr)
assets["assets/lang/valid-langs.js"] = bs
bs, _ = base64.StdEncoding.DecodeString("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 truncated
bs, _ = base64.StdEncoding.DecodeString("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 truncated
gr, _ = gzip.NewReader(bytes.NewReader(bs))
bs, _ = ioutil.ReadAll(gr)
assets["index.html"] = bs
@@ -192,7 +192,7 @@ func Assets() map[string][]byte {
bs, _ = ioutil.ReadAll(gr)
assets["scripts/syncthing/core/controllers/eventController.js"] = bs
bs, _ = base64.StdEncoding.DecodeString("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 truncated
bs, _ = base64.StdEncoding.DecodeString("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 truncated
gr, _ = gzip.NewReader(bytes.NewReader(bs))
bs, _ = ioutil.ReadAll(gr)
assets["scripts/syncthing/core/controllers/syncthingController.js"] = bs
+89
View File
@@ -0,0 +1,89 @@
// Copyright (C) 2015 The Syncthing Authors.
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// You can obtain one at http://mozilla.org/MPL/2.0/.
package versioner
import (
"errors"
"os"
"os/exec"
"path/filepath"
"strings"
)
func init() {
// Register the constructor for this type of versioner with the name "external"
Factories["external"] = NewExternal
}
// The type holds our configuration
type External struct {
command string
folderPath string
}
// The constructor function takes a map of parameters and creates the type.
func NewExternal(folderID, folderPath string, params map[string]string) Versioner {
command := params["command"]
s := External{
command: command,
folderPath: folderPath,
}
if debug {
l.Debugf("instantiated %#v", s)
}
return s
}
// Move away the named file to a version archive. If this function returns
// nil, the named file does not exist any more (has been archived).
func (v External) Archive(filePath string) error {
_, err := os.Lstat(filePath)
if os.IsNotExist(err) {
if debug {
l.Debugln("not archiving nonexistent file", filePath)
}
return nil
} else if err != nil {
return err
}
if debug {
l.Debugln("archiving", filePath)
}
inFolderPath, err := filepath.Rel(v.folderPath, filePath)
if err != nil {
return err
}
if v.command == "" {
return errors.New("Versioner: command is empty, please enter a valid command")
}
cmd := exec.Command(v.command, v.folderPath, inFolderPath)
env := os.Environ()
// filter STGUIAUTH and STGUIAPIKEY from environment variables
filteredEnv := []string{}
for _, x := range env {
if !strings.HasPrefix(x, "STGUIAUTH=") && !strings.HasPrefix(x, "STGUIAPIKEY=") {
filteredEnv = append(filteredEnv, x)
}
}
cmd.Env = filteredEnv
err = cmd.Run()
if err != nil {
return err
}
// return error if the file was not removed
if _, err = os.Lstat(filePath); os.IsNotExist(err) {
return nil
}
return errors.New("Versioner: file was not removed by external script")
}
+5 -6
View File
@@ -47,13 +47,12 @@ func NewSimple(folderID, folderPath string, params map[string]string) Versioner
// nil, the named file does not exist any more (has been archived).
func (v Simple) Archive(filePath string) error {
fileInfo, err := os.Lstat(filePath)
if err != nil {
if os.IsNotExist(err) {
if debug {
l.Debugln("not archiving nonexistent file", filePath)
}
return nil
if os.IsNotExist(err) {
if debug {
l.Debugln("not archiving nonexistent file", filePath)
}
return nil
} else if err != nil {
return err
}
+6 -6
View File
@@ -281,13 +281,13 @@ func (v Staggered) Archive(filePath string) error {
v.mutex.Lock()
defer v.mutex.Unlock()
if _, err := os.Lstat(filePath); err != nil {
if os.IsNotExist(err) {
if debug {
l.Debugln("not archiving nonexistent file", filePath)
}
return nil
_, err := os.Lstat(filePath)
if os.IsNotExist(err) {
if debug {
l.Debugln("not archiving nonexistent file", filePath)
}
return nil
} else if err != nil {
return err
}