@@ -30,11 +30,11 @@
30 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
31 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void undo_one(const char *zPathname, int redoFlag){
32 32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q;
33 33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zFullname;
34 34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q,
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "SELECT content, existsflag, isExe, isLink FROM undo"
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT content, existsflag, isExe, isLink, mtime FROM undo"
36 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" WHERE pathname=%Q AND redoflag=%d",
37 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zPathname, redoFlag
38 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
39 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db_step(&q)==SQLITE_ROW ){
40 40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int old_exists;
@@ -41,10 +41,11 @@
41 41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int new_exists;
42 42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int old_exe;
43 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int new_exe;
44 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int new_link;
45 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int old_link;
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 old_mtime, new_mtime;
46 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob current;
47 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob new;
48 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zFullname = mprintf("%s/%s", g.zLocalRoot, zPathname);
49 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
old_link = db_column_int(&q, 3);
50 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
new_link = file_wd_islink(zFullname);
@@ -54,17 +55,20 @@
54 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_read_link(¤t, zFullname);
55 56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
56 57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_read_from_file(¤t, zFullname);
57 58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
58 59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
new_exe = file_wd_isexe(zFullname);
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ new_mtime = file_wd_mtime(zFullname);
59 61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
60 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(¤t);
61 63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
new_exe = 0;
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ new_mtime = 0;
62 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
63 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&new);
64 67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
old_exists = db_column_int(&q, 1);
65 68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
old_exe = db_column_int(&q, 2);
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ old_mtime = db_column_int64(&q, 4);
66 70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( old_exists ){
67 71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_ephemeral_blob(&q, 0, &new);
68 72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
69 73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( old_exists ){
70 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( new_exists ){
@@ -79,22 +83,23 @@
79 83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
symlink_create(blob_str(&new), zFullname);
80 84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
81 85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_write_to_file(&new, zFullname);
82 86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
83 87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
file_wd_setexe(zFullname, old_exe);
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file_set_mtime(zFullname, old_mtime);
84 89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
85 90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("DELETE %s\n", zPathname);
86 91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
file_delete(zFullname);
87 92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
88 93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&new);
89 94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(zFullname);
90 95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
91 96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q,
92 97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"UPDATE undo SET content=:c, existsflag=%d, isExe=%d, isLink=%d,"
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " redoflag=NOT redoflag"
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " mtime=%lld, redoflag=NOT redoflag"
94 99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" WHERE pathname=%Q",
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- new_exists, new_exe, new_link, zPathname
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ new_exists, new_exe, new_link, new_mtime, zPathname
96 101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
97 102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( new_exists ){
98 103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_blob(&q, ":c", ¤t);
99 104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100 105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_step(&q);
@@ -225,10 +230,11 @@
225 230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ pathname TEXT UNIQUE, -- Name of the file
226 231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ redoflag BOOLEAN, -- 0 for undoable. 1 for redoable
227 232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ existsflag BOOLEAN, -- True if the file exists
228 233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ isExe BOOLEAN, -- True if the file is executable
229 234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ isLink BOOLEAN, -- True if the file is symlink
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ mtime DATETIME, -- File modification time
230 236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ content BLOB -- Saved content
231 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ );
232 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ CREATE TABLE %s.undo_vfile AS SELECT * FROM vfile;
233 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ CREATE TABLE %s.undo_vmerge AS SELECT * FROM vmerge;
234 240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
;
@@ -274,13 +280,14 @@
274 280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zFullname = mprintf("%s%s", g.zLocalRoot, zPathname);
275 281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
existsFlag = file_wd_size(zFullname)>=0;
276 282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isLink = file_wd_islink(zFullname);
277 283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q,
278 284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"INSERT OR IGNORE INTO"
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " undo(pathname,redoflag,existsflag,isExe,isLink,content)"
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " VALUES(%Q,0,%d,%d,%d,:c)",
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zPathname, existsFlag, file_wd_isexe(zFullname), isLink
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " undo(pathname,redoflag,existsflag,isExe,isLink,mtime,content)"
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " VALUES(%Q,0,%d,%d,%d,%lld,:c)",
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zPathname, existsFlag, file_wd_isexe(zFullname), isLink,
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file_wd_mtime(zFullname)
282 289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
283 290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( existsFlag ){
284 291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isLink ){
285 292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_read_link(&content, zFullname);
286 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
@@ -383,10 +390,11 @@
383 390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isRedo = g.argv[1][0]=='r';
384 391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int undo_available;
385 392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int explainFlag = find_option("explain", 0, 0)!=0;
386 393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zCmd = isRedo ? "redo" : "undo";
387 394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_must_be_within_tree();
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( find_option("reset", 0, 0)!=0 ){ undo_reset(); return; }
388 396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
verify_all_options();
389 397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_begin_transaction();
390 398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
undo_available = db_lget_int("undo_available", 0);
391 399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( explainFlag ){
392 400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( undo_available==0 ){
393 401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!