Fossil SCM

Get the "fossil patch view" command working

drh 2021-06-21 19:34 patch-cmd
Commit b08e8651e4990b3332d9d8591eb643851c218e864a10666b26d208f378f6bc69
1 file changed +50 -1
+50 -1
--- src/patch.c
+++ src/patch.c
@@ -104,10 +104,58 @@
104104
" WHERE blob.rid=vfile.rid AND NOT deleted AND chnged;",
105105
g.zLocalRoot
106106
);
107107
}
108108
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
+
109157
110158
/*
111159
** COMMAND: patch
112160
**
113161
** Usage: %fossil patch SUBCOMMAND ?ARGS ..?
@@ -185,11 +233,12 @@
185233
/* u64 diffFlags = diff_options(); */
186234
verify_all_options();
187235
if( g.argc!=4 ){
188236
usage("view FILENAME");
189237
}
190
- fossil_print("TBD...\n");
238
+ patch_attach(g.argv[3]);
239
+ patch_view();
191240
}else
192241
{
193242
goto patch_usage;
194243
}
195244
}
196245
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button