Fossil SCM
Get the "fossil patch view" command working
Commit
b08e8651e4990b3332d9d8591eb643851c218e864a10666b26d208f378f6bc69
Parent
7333115dc28b51c…
1 file changed
+50
-1
+50
-1
| --- src/patch.c | ||
| +++ src/patch.c | ||
| @@ -104,10 +104,58 @@ | ||
| 104 | 104 | " WHERE blob.rid=vfile.rid AND NOT deleted AND chnged;", |
| 105 | 105 | g.zLocalRoot |
| 106 | 106 | ); |
| 107 | 107 | } |
| 108 | 108 | |
| 109 | +/* | |
| 110 | +** Attempt to load and validate a patchfile identified by the first | |
| 111 | +** argument. | |
| 112 | +*/ | |
| 113 | +void patch_attach(const char *zIn){ | |
| 114 | + Stmt q; | |
| 115 | + if( !file_isfile(zIn, zIn) ){ | |
| 116 | + fossil_fatal("no such file: %s", zIn); | |
| 117 | + } | |
| 118 | + if( g.db==0 ){ | |
| 119 | + sqlite3_open(":memory:", &g.db); | |
| 120 | + } | |
| 121 | + db_multi_exec("ATTACH %Q AS patch", zIn); | |
| 122 | + db_prepare(&q, "PRAGMA patch.quick_check"); | |
| 123 | + while( db_step(&q)==SQLITE_ROW ){ | |
| 124 | + if( fossil_strcmp(db_column_text(&q,0),"ok")!=0 ){ | |
| 125 | + fossil_fatal("file %s is not a well-formed Fossil patchfile", zIn); | |
| 126 | + } | |
| 127 | + } | |
| 128 | + db_finalize(&q); | |
| 129 | +} | |
| 130 | + | |
| 131 | +/* | |
| 132 | +** Show a summary of the content of a patch on standard output | |
| 133 | +*/ | |
| 134 | +void patch_view(void){ | |
| 135 | + Stmt q; | |
| 136 | + db_prepare(&q, "SELECT value FROM patch.cfg WHERE key='baseline'"); | |
| 137 | + if( db_step(&q)==SQLITE_ROW ){ | |
| 138 | + fossil_print("Patch against check-in %S\n", db_column_text(&q,0)); | |
| 139 | + }else{ | |
| 140 | + fossil_fatal("ERROR: Missing patch baseline"); | |
| 141 | + } | |
| 142 | + db_finalize(&q); | |
| 143 | + db_prepare(&q, "SELECT fname, hash IS NULL AS isnew, delta IS NULL AS isdel" | |
| 144 | + " FROM patch.chng ORDER BY 1"); | |
| 145 | + while( db_step(&q)==SQLITE_ROW ){ | |
| 146 | + const char *zClass = "CHANGED"; | |
| 147 | + if( db_column_int(&q, 1) ){ | |
| 148 | + zClass = "NEW"; | |
| 149 | + }else if( db_column_int(&q, 2) ){ | |
| 150 | + zClass = "DELETED"; | |
| 151 | + } | |
| 152 | + fossil_print("%-10s %s\n", zClass, db_column_text(&q,0)); | |
| 153 | + } | |
| 154 | + db_finalize(&q); | |
| 155 | +} | |
| 156 | + | |
| 109 | 157 | |
| 110 | 158 | /* |
| 111 | 159 | ** COMMAND: patch |
| 112 | 160 | ** |
| 113 | 161 | ** Usage: %fossil patch SUBCOMMAND ?ARGS ..? |
| @@ -185,11 +233,12 @@ | ||
| 185 | 233 | /* u64 diffFlags = diff_options(); */ |
| 186 | 234 | verify_all_options(); |
| 187 | 235 | if( g.argc!=4 ){ |
| 188 | 236 | usage("view FILENAME"); |
| 189 | 237 | } |
| 190 | - fossil_print("TBD...\n"); | |
| 238 | + patch_attach(g.argv[3]); | |
| 239 | + patch_view(); | |
| 191 | 240 | }else |
| 192 | 241 | { |
| 193 | 242 | goto patch_usage; |
| 194 | 243 | } |
| 195 | 244 | } |
| 196 | 245 |
| --- src/patch.c | |
| +++ src/patch.c | |
| @@ -104,10 +104,58 @@ | |
| 104 | " WHERE blob.rid=vfile.rid AND NOT deleted AND chnged;", |
| 105 | g.zLocalRoot |
| 106 | ); |
| 107 | } |
| 108 | |
| 109 | |
| 110 | /* |
| 111 | ** COMMAND: patch |
| 112 | ** |
| 113 | ** Usage: %fossil patch SUBCOMMAND ?ARGS ..? |
| @@ -185,11 +233,12 @@ | |
| 185 | /* u64 diffFlags = diff_options(); */ |
| 186 | verify_all_options(); |
| 187 | if( g.argc!=4 ){ |
| 188 | usage("view FILENAME"); |
| 189 | } |
| 190 | fossil_print("TBD...\n"); |
| 191 | }else |
| 192 | { |
| 193 | goto patch_usage; |
| 194 | } |
| 195 | } |
| 196 |
| --- src/patch.c | |
| +++ src/patch.c | |
| @@ -104,10 +104,58 @@ | |
| 104 | " WHERE blob.rid=vfile.rid AND NOT deleted AND chnged;", |
| 105 | g.zLocalRoot |
| 106 | ); |
| 107 | } |
| 108 | |
| 109 | /* |
| 110 | ** Attempt to load and validate a patchfile identified by the first |
| 111 | ** argument. |
| 112 | */ |
| 113 | void patch_attach(const char *zIn){ |
| 114 | Stmt q; |
| 115 | if( !file_isfile(zIn, zIn) ){ |
| 116 | fossil_fatal("no such file: %s", zIn); |
| 117 | } |
| 118 | if( g.db==0 ){ |
| 119 | sqlite3_open(":memory:", &g.db); |
| 120 | } |
| 121 | db_multi_exec("ATTACH %Q AS patch", zIn); |
| 122 | db_prepare(&q, "PRAGMA patch.quick_check"); |
| 123 | while( db_step(&q)==SQLITE_ROW ){ |
| 124 | if( fossil_strcmp(db_column_text(&q,0),"ok")!=0 ){ |
| 125 | fossil_fatal("file %s is not a well-formed Fossil patchfile", zIn); |
| 126 | } |
| 127 | } |
| 128 | db_finalize(&q); |
| 129 | } |
| 130 | |
| 131 | /* |
| 132 | ** Show a summary of the content of a patch on standard output |
| 133 | */ |
| 134 | void patch_view(void){ |
| 135 | Stmt q; |
| 136 | db_prepare(&q, "SELECT value FROM patch.cfg WHERE key='baseline'"); |
| 137 | if( db_step(&q)==SQLITE_ROW ){ |
| 138 | fossil_print("Patch against check-in %S\n", db_column_text(&q,0)); |
| 139 | }else{ |
| 140 | fossil_fatal("ERROR: Missing patch baseline"); |
| 141 | } |
| 142 | db_finalize(&q); |
| 143 | db_prepare(&q, "SELECT fname, hash IS NULL AS isnew, delta IS NULL AS isdel" |
| 144 | " FROM patch.chng ORDER BY 1"); |
| 145 | while( db_step(&q)==SQLITE_ROW ){ |
| 146 | const char *zClass = "CHANGED"; |
| 147 | if( db_column_int(&q, 1) ){ |
| 148 | zClass = "NEW"; |
| 149 | }else if( db_column_int(&q, 2) ){ |
| 150 | zClass = "DELETED"; |
| 151 | } |
| 152 | fossil_print("%-10s %s\n", zClass, db_column_text(&q,0)); |
| 153 | } |
| 154 | db_finalize(&q); |
| 155 | } |
| 156 | |
| 157 | |
| 158 | /* |
| 159 | ** COMMAND: patch |
| 160 | ** |
| 161 | ** Usage: %fossil patch SUBCOMMAND ?ARGS ..? |
| @@ -185,11 +233,12 @@ | |
| 233 | /* u64 diffFlags = diff_options(); */ |
| 234 | verify_all_options(); |
| 235 | if( g.argc!=4 ){ |
| 236 | usage("view FILENAME"); |
| 237 | } |
| 238 | patch_attach(g.argv[3]); |
| 239 | patch_view(); |
| 240 | }else |
| 241 | { |
| 242 | goto patch_usage; |
| 243 | } |
| 244 | } |
| 245 |