Fossil SCM

Enhanced ability to deal with merges.

drh 2021-06-21 22:43 patch-cmd
Commit 03dca8fca9bb629df30b17f80776138fbe8ac6e974fa04c865b3938914e427a6
1 file changed +25 -4
+25 -4
--- src/patch.c
+++ src/patch.c
@@ -108,10 +108,11 @@
108108
** Generate a binary patch file and store it into the file
109109
** named zOut.
110110
*/
111111
void patch_create(const char *zOut){
112112
int vid;
113
+
113114
if( file_isdir(zOut, ExtFILE)!=0 ){
114115
fossil_fatal("patch file already exists: %s", zOut);
115116
}
116117
add_content_sql_commands(g.db);
117118
deltafunc_init(g.db);
@@ -160,17 +161,28 @@
160161
" FROM vfile WHERE deleted;"
161162
);
162163
/* Changed files */
163164
db_multi_exec(
164165
"INSERT INTO patch.chng(pathname,origname,hash,isexe,islink,delta)"
165
- " SELECT pathname, origname, blob.uuid, isexe, islink,"
166
+ " SELECT pathname, nullif(origname,pathname), blob.uuid, isexe, islink,"
166167
" mkdelta(blob.rid, %Q||pathname)"
167168
" FROM vfile, blob"
168169
" WHERE blob.rid=vfile.rid"
169170
" AND NOT deleted AND (chnged OR origname<>pathname);",
170171
g.zLocalRoot
171172
);
173
+
174
+ if( db_exists("SELECT 1 FROM localdb.vmerge WHERE id<=0") ){
175
+ db_multi_exec(
176
+ "CREATE TABLE patch.patchmerge(type TEXT,mhash TEXT);\n"
177
+ "WITH tmap(id,type) AS (VALUES(0,'merge'),(-1,'cherrypick'),"
178
+ "(-2,'backout'),(-4,'integrate'))"
179
+ "INSERT INTO patch.patchmerge(type,mhash)"
180
+ " SELECT tmap.type,vmerge.mhash FROM vmerge, tmap"
181
+ " WHERE tmap.id=vmerge.id;"
182
+ );
183
+ }
172184
}
173185
174186
/*
175187
** Attempt to load and validate a patchfile identified by the first
176188
** argument.
@@ -198,29 +210,38 @@
198210
*/
199211
void patch_view(void){
200212
Stmt q;
201213
db_prepare(&q, "SELECT value FROM patch.cfg WHERE key='baseline'");
202214
if( db_step(&q)==SQLITE_ROW ){
203
- fossil_print("Patch against check-in %S\n", db_column_text(&q,0));
215
+ fossil_print("%-10s %s\n", "BASELINE", db_column_text(&q,0));
204216
}else{
205217
fossil_fatal("ERROR: Missing patch baseline");
206218
}
207219
db_finalize(&q);
220
+ if( db_table_exists("patch","patchmerge") ){
221
+ db_prepare(&q, "SELECT upper(type),mhash FROM patchmerge");
222
+ while( db_step(&q)==SQLITE_ROW ){
223
+ fossil_print("%-10s %s\n",
224
+ db_column_text(&q,0),
225
+ db_column_text(&q,1));
226
+ }
227
+ db_finalize(&q);
228
+ }
208229
db_prepare(&q,
209230
"SELECT pathname,"
210231
" hash IS NULL AND delta IS NOT NULL,"
211232
" delta IS NULL,"
212233
" origname"
213234
" FROM patch.chng ORDER BY 1");
214235
while( db_step(&q)==SQLITE_ROW ){
215
- const char *zClass = "CHANGED";
236
+ const char *zClass = "EDIT";
216237
const char *zName = db_column_text(&q,0);
217238
const char *zOrigName = db_column_text(&q, 3);
218239
if( db_column_int(&q, 1) && zOrigName==0 ){
219240
zClass = "NEW";
220241
}else if( db_column_int(&q, 2) ){
221
- zClass = zOrigName==0 ? "DELETED" : 0;
242
+ zClass = zOrigName==0 ? "DELETE" : 0;
222243
}
223244
if( zOrigName!=0 && zOrigName[0]!=0 ){
224245
fossil_print("%-10s %s -> %s\n", "RENAME",zOrigName,zName);
225246
}
226247
if( zClass ){
227248
--- src/patch.c
+++ src/patch.c
@@ -108,10 +108,11 @@
108 ** Generate a binary patch file and store it into the file
109 ** named zOut.
110 */
111 void patch_create(const char *zOut){
112 int vid;
 
113 if( file_isdir(zOut, ExtFILE)!=0 ){
114 fossil_fatal("patch file already exists: %s", zOut);
115 }
116 add_content_sql_commands(g.db);
117 deltafunc_init(g.db);
@@ -160,17 +161,28 @@
160 " FROM vfile WHERE deleted;"
161 );
162 /* Changed files */
163 db_multi_exec(
164 "INSERT INTO patch.chng(pathname,origname,hash,isexe,islink,delta)"
165 " SELECT pathname, origname, blob.uuid, isexe, islink,"
166 " mkdelta(blob.rid, %Q||pathname)"
167 " FROM vfile, blob"
168 " WHERE blob.rid=vfile.rid"
169 " AND NOT deleted AND (chnged OR origname<>pathname);",
170 g.zLocalRoot
171 );
 
 
 
 
 
 
 
 
 
 
 
172 }
173
174 /*
175 ** Attempt to load and validate a patchfile identified by the first
176 ** argument.
@@ -198,29 +210,38 @@
198 */
199 void patch_view(void){
200 Stmt q;
201 db_prepare(&q, "SELECT value FROM patch.cfg WHERE key='baseline'");
202 if( db_step(&q)==SQLITE_ROW ){
203 fossil_print("Patch against check-in %S\n", db_column_text(&q,0));
204 }else{
205 fossil_fatal("ERROR: Missing patch baseline");
206 }
207 db_finalize(&q);
 
 
 
 
 
 
 
 
 
208 db_prepare(&q,
209 "SELECT pathname,"
210 " hash IS NULL AND delta IS NOT NULL,"
211 " delta IS NULL,"
212 " origname"
213 " FROM patch.chng ORDER BY 1");
214 while( db_step(&q)==SQLITE_ROW ){
215 const char *zClass = "CHANGED";
216 const char *zName = db_column_text(&q,0);
217 const char *zOrigName = db_column_text(&q, 3);
218 if( db_column_int(&q, 1) && zOrigName==0 ){
219 zClass = "NEW";
220 }else if( db_column_int(&q, 2) ){
221 zClass = zOrigName==0 ? "DELETED" : 0;
222 }
223 if( zOrigName!=0 && zOrigName[0]!=0 ){
224 fossil_print("%-10s %s -> %s\n", "RENAME",zOrigName,zName);
225 }
226 if( zClass ){
227
--- src/patch.c
+++ src/patch.c
@@ -108,10 +108,11 @@
108 ** Generate a binary patch file and store it into the file
109 ** named zOut.
110 */
111 void patch_create(const char *zOut){
112 int vid;
113
114 if( file_isdir(zOut, ExtFILE)!=0 ){
115 fossil_fatal("patch file already exists: %s", zOut);
116 }
117 add_content_sql_commands(g.db);
118 deltafunc_init(g.db);
@@ -160,17 +161,28 @@
161 " FROM vfile WHERE deleted;"
162 );
163 /* Changed files */
164 db_multi_exec(
165 "INSERT INTO patch.chng(pathname,origname,hash,isexe,islink,delta)"
166 " SELECT pathname, nullif(origname,pathname), blob.uuid, isexe, islink,"
167 " mkdelta(blob.rid, %Q||pathname)"
168 " FROM vfile, blob"
169 " WHERE blob.rid=vfile.rid"
170 " AND NOT deleted AND (chnged OR origname<>pathname);",
171 g.zLocalRoot
172 );
173
174 if( db_exists("SELECT 1 FROM localdb.vmerge WHERE id<=0") ){
175 db_multi_exec(
176 "CREATE TABLE patch.patchmerge(type TEXT,mhash TEXT);\n"
177 "WITH tmap(id,type) AS (VALUES(0,'merge'),(-1,'cherrypick'),"
178 "(-2,'backout'),(-4,'integrate'))"
179 "INSERT INTO patch.patchmerge(type,mhash)"
180 " SELECT tmap.type,vmerge.mhash FROM vmerge, tmap"
181 " WHERE tmap.id=vmerge.id;"
182 );
183 }
184 }
185
186 /*
187 ** Attempt to load and validate a patchfile identified by the first
188 ** argument.
@@ -198,29 +210,38 @@
210 */
211 void patch_view(void){
212 Stmt q;
213 db_prepare(&q, "SELECT value FROM patch.cfg WHERE key='baseline'");
214 if( db_step(&q)==SQLITE_ROW ){
215 fossil_print("%-10s %s\n", "BASELINE", db_column_text(&q,0));
216 }else{
217 fossil_fatal("ERROR: Missing patch baseline");
218 }
219 db_finalize(&q);
220 if( db_table_exists("patch","patchmerge") ){
221 db_prepare(&q, "SELECT upper(type),mhash FROM patchmerge");
222 while( db_step(&q)==SQLITE_ROW ){
223 fossil_print("%-10s %s\n",
224 db_column_text(&q,0),
225 db_column_text(&q,1));
226 }
227 db_finalize(&q);
228 }
229 db_prepare(&q,
230 "SELECT pathname,"
231 " hash IS NULL AND delta IS NOT NULL,"
232 " delta IS NULL,"
233 " origname"
234 " FROM patch.chng ORDER BY 1");
235 while( db_step(&q)==SQLITE_ROW ){
236 const char *zClass = "EDIT";
237 const char *zName = db_column_text(&q,0);
238 const char *zOrigName = db_column_text(&q, 3);
239 if( db_column_int(&q, 1) && zOrigName==0 ){
240 zClass = "NEW";
241 }else if( db_column_int(&q, 2) ){
242 zClass = zOrigName==0 ? "DELETE" : 0;
243 }
244 if( zOrigName!=0 && zOrigName[0]!=0 ){
245 fossil_print("%-10s %s -> %s\n", "RENAME",zOrigName,zName);
246 }
247 if( zClass ){
248

Keyboard Shortcuts

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