Revision 5019
org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/org.gvsig.vcsgis.swing/org.gvsig.vcsgis.swing.impl/src/main/java/org/gvsig/vcsgis/swing/impl/managehistory/BackupHistory.java | ||
---|---|---|
7 | 7 |
|
8 | 8 |
import java.io.File; |
9 | 9 |
import java.util.Map; |
10 |
import java.util.concurrent.Callable; |
|
10 | 11 |
import org.gvsig.fmap.dal.DALLocator; |
11 | 12 |
import org.gvsig.fmap.dal.DataManager; |
12 | 13 |
import org.gvsig.fmap.dal.DataStoreParameters; |
... | ... | |
25 | 26 |
import org.gvsig.tools.dispose.DisposeUtils; |
26 | 27 |
import org.gvsig.tools.task.SimpleTaskStatus; |
27 | 28 |
import org.gvsig.vcsgis.lib.VCSGisEntity; |
29 |
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_EXCEPTION; |
|
30 |
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_OK; |
|
28 | 31 |
import org.slf4j.Logger; |
29 | 32 |
import org.slf4j.LoggerFactory; |
30 | 33 |
|
... | ... | |
32 | 35 |
* |
33 | 36 |
* @author fdiaz |
34 | 37 |
*/ |
35 |
public class BackupHistory implements Runnable {
|
|
38 |
public class BackupHistory implements Callable<Integer> {
|
|
36 | 39 |
|
37 | 40 |
private static final Logger LOGGER = LoggerFactory.getLogger(BackupHistory.class); |
38 | 41 |
|
42 |
public static final String ENTITIES_FILE_PREFIX = "ENTITIES_"; |
|
43 |
public static final String REVISIONS_FILE_PREFIX = "REVISIONS_"; |
|
44 |
public static final String DATA_FILE_PREFIX = "DATA_"; |
|
39 | 45 |
|
40 | 46 |
private final JDBCServerExplorerParameters repository; |
41 | 47 |
private final File targetfolder; |
... | ... | |
50 | 56 |
} |
51 | 57 |
|
52 | 58 |
@Override |
53 |
public void run() {
|
|
59 |
public Integer call() {
|
|
54 | 60 |
|
55 | 61 |
if( this.status == null ) { |
56 | 62 |
this.status = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("vcsgis init"); |
... | ... | |
81 | 87 |
// Exportar DataRepoTable de la entidad |
82 | 88 |
exportDataTable(sourceExplorer, targetExplorer, entity, revisionsMap); |
83 | 89 |
status.terminate(); |
90 |
return ERR_OK; |
|
84 | 91 |
} catch (Exception ex) { |
85 | 92 |
LOGGER.warn("Can't export history.", ex); |
86 | 93 |
status.abort(); |
94 |
return ERR_EXCEPTION; |
|
87 | 95 |
} finally { |
88 | 96 |
status.pop(); |
89 | 97 |
} |
... | ... | |
98 | 106 |
try { |
99 | 107 |
status.message("Exporting entities table."); |
100 | 108 |
String sourceTable = "VCSGISREPO_ENTITIES"; |
101 |
String targetTable = "ENTITIES_"+entity.getEntityName();
|
|
109 |
String targetTable = ENTITIES_FILE_PREFIX+entity.getEntityName();
|
|
102 | 110 |
String filter = "\"COD_ENTITY\"='"+entity.getEntityCode()+"'"; |
103 | 111 |
|
104 | 112 |
DataManager dataManager = DALLocator.getDataManager(); |
... | ... | |
145 | 153 |
status.message("Exporting revision table."); |
146 | 154 |
|
147 | 155 |
String sourceTable = "VCSGISREPO_REVISIONS"; |
148 |
String targetTable = "REVISIONS_"+entity.getEntityName();
|
|
156 |
String targetTable = REVISIONS_FILE_PREFIX+entity.getEntityName();
|
|
149 | 157 |
String filter = "\"COD_ENTITY\"='"+entity.getEntityCode()+"'"; |
150 | 158 |
String order = "+REV_NUMBER"; |
151 | 159 |
|
... | ... | |
200 | 208 |
status.message("Exporting data table."); |
201 | 209 |
|
202 | 210 |
String sourceTable = "VCSGISREPO_DATA"; |
203 |
String targetTable = "DATA_"+entity.getEntityName();
|
|
211 |
String targetTable = DATA_FILE_PREFIX+entity.getEntityName();
|
|
204 | 212 |
String filter = "\"COD_ENTITY\"='"+entity.getEntityCode()+"'"; |
205 | 213 |
// String order = "+REV_NUMBER"; |
206 | 214 |
|
org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/org.gvsig.vcsgis.swing/org.gvsig.vcsgis.swing.impl/src/main/java/org/gvsig/vcsgis/swing/impl/managehistory/VCSGisJRestoreHistoryImpl.java | ||
---|---|---|
22 | 22 |
package org.gvsig.vcsgis.swing.impl.managehistory; |
23 | 23 |
|
24 | 24 |
import java.awt.Cursor; |
25 |
import java.io.File; |
|
25 | 26 |
import javax.swing.ImageIcon; |
26 | 27 |
import javax.swing.JComponent; |
27 | 28 |
import javax.swing.SwingUtilities; |
28 | 29 |
import javax.swing.event.ChangeEvent; |
30 |
import javax.swing.filechooser.FileFilter; |
|
31 |
import org.apache.commons.io.FilenameUtils; |
|
32 |
import org.apache.commons.lang3.StringUtils; |
|
33 |
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters; |
|
29 | 34 |
import org.gvsig.tools.ToolsLocator; |
30 | 35 |
import org.gvsig.tools.i18n.I18nManager; |
31 | 36 |
import org.gvsig.tools.swing.api.Component; |
... | ... | |
38 | 43 |
import org.gvsig.tools.swing.api.task.TaskStatusSwingManager; |
39 | 44 |
import org.gvsig.tools.swing.api.windowmanager.Dialog; |
40 | 45 |
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2; |
46 |
import org.gvsig.tools.task.SimpleTaskStatus; |
|
47 |
import org.gvsig.vcsgis.lib.UserCancelledException; |
|
48 |
import org.gvsig.vcsgis.lib.VCSGisEntity; |
|
41 | 49 |
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_CANT_CHECKOUT; |
50 |
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_OK; |
|
42 | 51 |
import org.gvsig.vcsgis.lib.VCSGisRuntimeException; |
43 | 52 |
import org.gvsig.vcsgis.lib.repository.VCSGisRepository; |
44 | 53 |
import org.gvsig.vcsgis.lib.repository.VCSGisRepositoryLocaldbApi; |
... | ... | |
52 | 61 |
import static org.gvsig.vcsgis.swing.impl.VCSGisSwingManagerImpl.ICON_GROUP_NAME; |
53 | 62 |
import static org.gvsig.vcsgis.swing.impl.VCSGisSwingManagerImpl.ICON_PROVIDER_NAME; |
54 | 63 |
import static org.gvsig.vcsgis.swing.impl.VCSGisSwingManagerImpl.registerIcons; |
64 |
import static org.gvsig.vcsgis.swing.impl.managehistory.BackupHistory.ENTITIES_FILE_PREFIX; |
|
55 | 65 |
import org.slf4j.LoggerFactory; |
56 | 66 |
|
57 | 67 |
/** |
... | ... | |
110 | 120 |
btnSelectFolder |
111 | 121 |
); |
112 | 122 |
|
123 |
this.fileController.setFileFilter(new FileFilter() { |
|
124 |
@Override |
|
125 |
public boolean accept(File f) { |
|
126 |
String name = f.getName(); |
|
127 |
if(f.isDirectory()){ |
|
128 |
return true; |
|
129 |
} |
|
130 |
if(FilenameUtils.isExtension(name.toLowerCase(), "csv") && |
|
131 |
StringUtils.startsWithIgnoreCase(name, ENTITIES_FILE_PREFIX)) { |
|
132 |
return true; |
|
133 |
}; |
|
134 |
return false; |
|
135 |
} |
|
136 |
|
|
137 |
@Override |
|
138 |
public String getDescription() { |
|
139 |
I18nManager i18n = ToolsLocator.getI18nManager(); |
|
140 |
return i18n.getTranslation("_Entity_history_backup_files"); |
|
141 |
} |
|
142 |
}); |
|
143 |
|
|
113 | 144 |
this.fileController.addChangeListener((ChangeEvent e) -> { |
114 | 145 |
doUpdateComponents(); |
115 | 146 |
}); |
... | ... | |
233 | 264 |
final VCSGisWorkspace workspace = this.getWorkspace(); |
234 | 265 |
boolean replaceLayerIfExists = true; |
235 | 266 |
|
236 |
//TODO: |
|
237 |
|
|
238 |
// if (workspace != null && !entities.isEmpty() ) { |
|
239 |
// SimpleTaskStatus taskStatus = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("Download changes"); |
|
240 |
// try { |
|
241 |
// taskStatus.setAutoremove(true); |
|
242 |
// taskStatus.add(); |
|
243 |
// taskStatus.setRangeOfValues(0, entities.size()); |
|
244 |
// taskStatus.setCurValue(0); |
|
245 |
// this.taskStatusController.bind(taskStatus); |
|
246 |
// processing = true; |
|
247 |
// doUpdateComponents(); |
|
248 |
// |
|
249 |
// VCSGisRepository repository = workspace.getRepository(); |
|
250 |
// JDBCServerExplorerParameters serverExplorerParameters = null; |
|
251 |
// if(repository instanceof VCSGisRepositoryLocaldbApi){ |
|
252 |
// serverExplorerParameters = ((VCSGisRepositoryLocaldbApi)repository).getServerExplorer().getParameters(); |
|
253 |
// } |
|
254 |
// int res = ERR_OK; |
|
267 |
|
|
268 |
File entitiesFile = fileController.get(); |
|
269 |
if (workspace != null && entitiesFile != null && entitiesFile.exists() ) { |
|
270 |
SimpleTaskStatus taskStatus = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("Download changes"); |
|
271 |
try { |
|
272 |
taskStatus.setAutoremove(true); |
|
273 |
taskStatus.add(); |
|
274 |
taskStatus.setRangeOfValues(0, 1); |
|
275 |
taskStatus.setCurValue(0); |
|
276 |
this.taskStatusController.bind(taskStatus); |
|
277 |
processing = true; |
|
278 |
doUpdateComponents(); |
|
279 |
|
|
280 |
VCSGisRepository repository = workspace.getRepository(); |
|
281 |
JDBCServerExplorerParameters serverExplorerParameters = null; |
|
282 |
if(repository instanceof VCSGisRepositoryLocaldbApi){ |
|
283 |
serverExplorerParameters = ((VCSGisRepositoryLocaldbApi)repository).getServerExplorer().getParameters(); |
|
284 |
} |
|
285 |
int res = ERR_OK; |
|
286 |
// Note: RestoreHistory only restore one entity per file |
|
255 | 287 |
// for (VCSGisEntity entity : entities) { |
256 |
// taskStatus.setTitle("Export history" + " - " + entity.getLabel() + taskStatus.getProgressLabel()); |
|
257 |
// showMessage(i18n.getTranslation("_Processing"), null); |
|
258 |
// BackupHistory exportHistory = new BackupHistory(serverExplorerParameters, fileController.get(), entity, taskStatus); |
|
259 |
// exportHistory.run(); |
|
260 |
// |
|
261 |
// taskStatus.incrementCurrentValue(); |
|
262 |
// |
|
288 |
taskStatus.setTitle("Restore history" + " - " + entitiesFile.getName() + taskStatus.getProgressLabel()); |
|
289 |
showMessage(i18n.getTranslation("_Processing"), null); |
|
290 |
RestoreHistory restoreHistory = new RestoreHistory( |
|
291 |
serverExplorerParameters, |
|
292 |
entitiesFile, taskStatus); |
|
293 |
res = restoreHistory.call(); |
|
294 |
if(res != ERR_OK){ |
|
295 |
showMessage(i18n.getTranslation("_Aborting_process"), null); |
|
296 |
taskStatus.abort(); |
|
297 |
return res; |
|
298 |
} |
|
299 |
taskStatus.incrementCurrentValue(); |
|
263 | 300 |
// } |
264 |
// showMessage(i18n.getTranslation("_Ended_process"), null); |
|
265 |
// taskStatus.terminate(); |
|
266 |
// return res; |
|
267 |
// } catch(UserCancelledException ex) { |
|
268 |
// LOGGER.warn("User cancelled"); |
|
269 |
// taskStatus.cancel(); |
|
270 |
// } catch(Exception ex) { |
|
271 |
// LOGGER.warn("Can't export history", ex); |
|
272 |
// taskStatus.abort(); |
|
273 |
// } finally { |
|
274 |
// processing = false; |
|
275 |
// doUpdateComponents(); |
|
276 |
// } |
|
277 |
// } |
|
301 |
showMessage(i18n.getTranslation("_Ended_process"), null); |
|
302 |
taskStatus.terminate(); |
|
303 |
return res; |
|
304 |
} catch(UserCancelledException ex) { |
|
305 |
LOGGER.warn("User cancelled"); |
|
306 |
taskStatus.cancel(); |
|
307 |
} catch(Exception ex) { |
|
308 |
LOGGER.warn("Can't restore history", ex); |
|
309 |
taskStatus.abort(); |
|
310 |
} finally { |
|
311 |
processing = false; |
|
312 |
doUpdateComponents(); |
|
313 |
} |
|
314 |
} |
|
315 |
|
|
316 |
|
|
317 |
|
|
318 |
|
|
278 | 319 |
return ERR_CANT_CHECKOUT; |
279 | 320 |
} |
280 | 321 |
|
org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/org.gvsig.vcsgis.swing/org.gvsig.vcsgis.swing.impl/src/main/java/org/gvsig/vcsgis/swing/impl/managehistory/VCSGisJBackupHistoryImpl.java | ||
---|---|---|
301 | 301 |
taskStatus.setTitle("Backup history" + " - " + entity.getLabel() + taskStatus.getProgressLabel()); |
302 | 302 |
showMessage(i18n.getTranslation("_Processing"), null); |
303 | 303 |
BackupHistory backupHistory = new BackupHistory(serverExplorerParameters, folderController.get(), entity, taskStatus); |
304 |
backupHistory.run(); |
|
305 |
|
|
304 |
res = backupHistory.call(); |
|
305 |
if(res != ERR_OK){ |
|
306 |
showMessage(i18n.getTranslation("_Aborting_process"), null); |
|
307 |
taskStatus.abort(); |
|
308 |
return res; |
|
309 |
} |
|
306 | 310 |
taskStatus.incrementCurrentValue(); |
307 |
|
|
308 | 311 |
} |
309 | 312 |
showMessage(i18n.getTranslation("_Ended_process"), null); |
310 | 313 |
taskStatus.terminate(); |
org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/org.gvsig.vcsgis.swing/org.gvsig.vcsgis.swing.impl/src/main/java/org/gvsig/vcsgis/swing/impl/managehistory/RestoreHistory.java | ||
---|---|---|
6 | 6 |
package org.gvsig.vcsgis.swing.impl.managehistory; |
7 | 7 |
|
8 | 8 |
import java.io.File; |
9 |
import java.util.concurrent.Callable; |
|
10 |
import javax.json.JsonObject; |
|
9 | 11 |
import org.apache.commons.io.FilenameUtils; |
12 |
import org.gvsig.expressionevaluator.spi.JsonUtils; |
|
10 | 13 |
import org.gvsig.fmap.dal.DALLocator; |
11 | 14 |
import org.gvsig.fmap.dal.DataManager; |
12 | 15 |
import org.gvsig.fmap.dal.DataStore; |
... | ... | |
24 | 27 |
import org.gvsig.tools.ToolsLocator; |
25 | 28 |
import org.gvsig.tools.dispose.DisposeUtils; |
26 | 29 |
import org.gvsig.tools.task.SimpleTaskStatus; |
30 |
import org.gvsig.vcsgis.lib.VCSGisManager; |
|
31 |
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_EXCEPTION; |
|
32 |
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_OK; |
|
27 | 33 |
import org.slf4j.Logger; |
28 | 34 |
import org.slf4j.LoggerFactory; |
29 | 35 |
|
... | ... | |
31 | 37 |
* |
32 | 38 |
* @author fdiaz |
33 | 39 |
*/ |
34 |
public class RestoreHistory implements Runnable {
|
|
40 |
public class RestoreHistory implements Callable<Integer> {
|
|
35 | 41 |
|
36 | 42 |
private static final Logger LOGGER = LoggerFactory.getLogger(RestoreHistory.class); |
37 | 43 |
|
... | ... | |
47 | 53 |
} |
48 | 54 |
|
49 | 55 |
@Override |
50 |
public void run() {
|
|
56 |
public Integer call() {
|
|
51 | 57 |
|
52 | 58 |
if( this.status == null ) { |
53 | 59 |
this.status = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("vcsgis init"); |
... | ... | |
147 | 153 |
targetDataStore.edit(MODE_APPEND); |
148 | 154 |
|
149 | 155 |
status.setCurValue(0); |
156 |
int line = 1; |
|
150 | 157 |
for (Feature feature : dataFeatures) { |
158 |
String data = feature.getString("DAT_DATA"); |
|
159 |
if(data != null){ |
|
160 |
JsonObject x = null; |
|
161 |
try { |
|
162 |
x = JsonUtils.toJsonObject(data); |
|
163 |
} catch (Exception ex) { |
|
164 |
throw new RuntimeException("DAT_DATA incorrect value at line "+line, ex); |
|
165 |
} |
|
166 |
|
|
167 |
if(x == null){ |
|
168 |
throw new RuntimeException("DAT_DATA incorrect value at line "+line); |
|
169 |
} |
|
170 |
} |
|
151 | 171 |
f = targetDataStore.createNewFeature(); |
152 | 172 |
f.copyFrom(feature); |
153 | 173 |
f.set("DAT_REVNUMBER", f.getLong("DAT_REVNUMBER")+firstRevisionNumber); |
154 | 174 |
targetDataStore.insert(f); |
175 |
|
|
155 | 176 |
status.incrementCurrentValue(); |
177 |
line++; |
|
156 | 178 |
} |
157 | 179 |
trans.commit(); |
158 | 180 |
status.terminate(); |
181 |
return ERR_OK; |
|
159 | 182 |
} catch (Exception ex) { |
160 | 183 |
LOGGER.warn("Can't export history.", ex); |
161 | 184 |
DataTransaction.rollbackQuietly(trans); |
162 | 185 |
status.abort(); |
186 |
return ERR_EXCEPTION; |
|
163 | 187 |
} finally { |
164 | 188 |
DisposeUtils.disposeQuietly(trans); |
165 | 189 |
status.pop(); |
org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/org.gvsig.vcsgis.swing/org.gvsig.vcsgis.swing.impl/src/test/java/org/gvsig/vcsgis/swing/impl/managehistory/Test01BackupHistory.java | ||
---|---|---|
340 | 340 |
ws1.getWorkspaceEntityByName("test"), |
341 | 341 |
null |
342 | 342 |
); |
343 |
backup.run(); |
|
343 |
r = backup.call(); |
|
344 |
assertEquals("backup status", ERR_NO_ERROR, r); |
|
344 | 345 |
|
345 | 346 |
// Inicializamos el repositorio y lo abrimos |
346 | 347 |
r = manager.initRepository(targetServer.getParameters(), null); |
... | ... | |
357 | 358 |
null |
358 | 359 |
); |
359 | 360 |
|
360 |
restore.run(); |
|
361 |
r = restore.call(); |
|
362 |
assertEquals("restore status", ERR_NO_ERROR, r); |
|
361 | 363 |
|
362 | 364 |
// ------------------------------------------------------------ |
363 | 365 |
// Creamos workspace1 y lo abrimos. |
org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/pom.xml | ||
---|---|---|
14 | 14 |
|
15 | 15 |
<properties> |
16 | 16 |
<org.gvsig.h2spatial.provider>org.gvsig.h2spatial.h2gis132.provider</org.gvsig.h2spatial.provider> |
17 |
<org.gvsig.topology.version>1.0.81</org.gvsig.topology.version>
|
|
18 |
<org.gvsig.oracle.version>2.0.62</org.gvsig.oracle.version>
|
|
19 |
<org.gvsig.postgresql.version>2.0.183</org.gvsig.postgresql.version>
|
|
17 |
<org.gvsig.topology.version>1.0.82-SNAPSHOT</org.gvsig.topology.version>
|
|
18 |
<org.gvsig.oracle.version>2.0.63-SNAPSHOT</org.gvsig.oracle.version>
|
|
19 |
<org.gvsig.postgresql.version>2.0.184-SNAPSHOT</org.gvsig.postgresql.version>
|
|
20 | 20 |
</properties> |
21 | 21 |
|
22 | 22 |
<url>https://devel.gvsig.org/sites/org.gvsig.vcsgis/${project.version}</url> |
org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/org.gvsig.vcsgis.app/org.gvsig.vcsgis.app.mainplugin/src/main/java/org/gvsig/vcsgis/app/VCSGisExtension.java | ||
---|---|---|
192 | 192 |
case "tools-vcsgis-prepare-workingcopy": |
193 | 193 |
showPrepareWorkingcopyDialog(); |
194 | 194 |
break; |
195 |
case "tools-vcsgis-export-history":
|
|
195 |
case "tools-vcsgis-backup-history":
|
|
196 | 196 |
showBackupHistoryDialog(); |
197 | 197 |
break; |
198 | 198 |
case "tools-vcsgis-restore-history": |
... | ... | |
613 | 613 |
VCSGisSwingManager swingManager = VCSGisSwingLocator.getVCSGisSwingManager(); |
614 | 614 |
|
615 | 615 |
VCSGisDialogInfo dialog = this.dialogsHelper.getOrCreateDialog("RestoreHistory", |
616 |
swingManager.createBackupHistoryPanel(),
|
|
616 |
swingManager.createRestoreHistoryPanel(),
|
|
617 | 617 |
"_VCS_Restore_history", |
618 | 618 |
"_VCS_Restore_history", |
619 | 619 |
"_VCS_Restore_history", |
org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/org.gvsig.vcsgis.app/org.gvsig.vcsgis.app.mainplugin/src/main/resources-plugin/config.xml | ||
---|---|---|
197 | 197 |
<action |
198 | 198 |
name="tools-vcsgis-backup-history" |
199 | 199 |
label="_VCS_Backup_history" |
200 |
tooltip="_Export_history"
|
|
200 |
tooltip="_Backup_history"
|
|
201 | 201 |
position="900700800" |
202 | 202 |
action-command="tools-vcsgis-backup-history" |
203 | 203 |
icon="tools-vcsgis-backup-history" |
org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/org.gvsig.vcsgis.app/org.gvsig.vcsgis.app.mainplugin/src/main/resources-plugin/i18n/text_en.properties | ||
---|---|---|
243 | 243 |
_VCS_Backup_history=Backup history |
244 | 244 |
_Folder=Folder |
245 | 245 |
_VCS_Restore_history=Restore historial |
246 |
_Entity_history_backup_files=Entity history backup files |
|
247 |
_EntitiesFile=Archivo de entidades |
|
248 |
_Replace_layer_if_exists=Replace layer if exists |
org.gvsig.vcsgis/trunk/org.gvsig.vcsgis/org.gvsig.vcsgis.app/org.gvsig.vcsgis.app.mainplugin/src/main/resources-plugin/i18n/text.properties | ||
---|---|---|
255 | 255 |
_VCS_Backup_history=Copia de seguridad del historial |
256 | 256 |
_Folder=Carpeta |
257 | 257 |
_VCS_Restore_history=Restaurar historial |
258 |
_Backup_history=Crea una copia de seguridad en csv del historial de una entidad |
|
259 |
_Restore_history=Restaura una copia de seguridad en csv del historial de una entidad |
|
260 |
_Entity_history_backup_files=Archivos de copia de seguridad del historial de entidades |
|
261 |
_EntitiesFile=Archivo de entidades |
|
262 |
_Replace_layer_if_exists=Reemplazar la capa si existe |
Also available in: Unified diff