Fossil SCM

Changes to get the "merge" command to process execute permission correctly. Ticket [baf9b6b11e08c1d0].

drh 2011-02-28 02:54 UTC exe-permission-fix
Commit 7a4d75fc8c415d1a2f43b27beee1f829d7003b35
1 file changed +19 -12
+19 -12
--- src/merge.c
+++ src/merge.c
@@ -158,20 +158,22 @@
158158
" idm INTEGER," /* VFILE entry for version merging in */
159159
" chnged BOOLEAN," /* True if current version has been edited */
160160
" ridv INTEGER," /* Record ID for current version */
161161
" ridp INTEGER," /* Record ID for pivot */
162162
" ridm INTEGER," /* Record ID for merge */
163
+ " isexe BOOLEAN," /* Execute permission enabled */
163164
" fnp TEXT," /* The filename in the pivot */
164165
" fnm TEXT" /* the filename in the merged version */
165166
");"
166167
);
167168
168169
/* Add files found in V
169170
*/
170171
db_multi_exec(
171
- "INSERT OR IGNORE INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,chnged)"
172
- " SELECT pathname, pathname, pathname, id, 0, 0, rid, 0, 0, chnged "
172
+ "INSERT OR IGNORE"
173
+ " INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,isexe,chnged)"
174
+ " SELECT pathname, pathname, pathname, id, 0, 0, rid, 0, 0, isexe, chnged "
173175
" FROM vfile WHERE vid=%d",
174176
vid
175177
);
176178
177179
/*
@@ -194,12 +196,13 @@
194196
}
195197
196198
/* Add files found in P but not in V
197199
*/
198200
db_multi_exec(
199
- "INSERT OR IGNORE INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,chnged)"
200
- " SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, 0 "
201
+ "INSERT OR IGNORE"
202
+ " INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,isexe,chnged)"
203
+ " SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, isexe, 0 "
201204
" FROM vfile"
202205
" WHERE vid=%d AND pathname NOT IN (SELECT fnp FROM fv)",
203206
pid
204207
);
205208
@@ -220,12 +223,13 @@
220223
}
221224
222225
/* Add files found in M but not in P or V.
223226
*/
224227
db_multi_exec(
225
- "INSERT OR IGNORE INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,chnged)"
226
- " SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, 0 "
228
+ "INSERT OR IGNORE"
229
+ " INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,isexe,chnged)"
230
+ " SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, isexe, 0 "
227231
" FROM vfile"
228232
" WHERE vid=%d"
229233
" AND pathname NOT IN (SELECT fnp FROM fv UNION SELECT fnm FROM fv)",
230234
mid
231235
);
@@ -242,19 +246,20 @@
242246
pid, pid, mid, mid
243247
);
244248
245249
if( debugFlag ){
246250
db_prepare(&q,
247
- "SELECT rowid, fn, fnp, fnm, chnged, ridv, ridp, ridm FROM fv"
251
+ "SELECT rowid, fn, fnp, fnm, chnged, ridv, ridp, ridm, isexe FROM fv"
248252
);
249253
while( db_step(&q)==SQLITE_ROW ){
250
- printf("%3d: ridv=%-4d ridp=%-4d ridm=%-4d chnged=%d\n",
254
+ printf("%3d: ridv=%-4d ridp=%-4d ridm=%-4d chnged=%d isexe=%d\n",
251255
db_column_int(&q, 0),
252256
db_column_int(&q, 5),
253257
db_column_int(&q, 6),
254258
db_column_int(&q, 7),
255
- db_column_int(&q, 4));
259
+ db_column_int(&q, 4),
260
+ db_column_int(&q, 8));
256261
printf(" fn = [%s]\n", db_column_text(&q, 1));
257262
printf(" fnp = [%s]\n", db_column_text(&q, 2));
258263
printf(" fnm = [%s]\n", db_column_text(&q, 3));
259264
}
260265
db_finalize(&q);
@@ -288,12 +293,12 @@
288293
int idm = db_column_int(&q, 0);
289294
int rowid = db_column_int(&q, 1);
290295
int idv;
291296
const char *zName;
292297
db_multi_exec(
293
- "INSERT INTO vfile(vid,chnged,deleted,rid,mrid,pathname)"
294
- " SELECT %d,3,0,rid,mrid,pathname FROM vfile WHERE id=%d",
298
+ "INSERT INTO vfile(vid,chnged,deleted,rid,mrid,isexe,pathname)"
299
+ " SELECT %d,3,0,rid,mrid,isexe,pathname FROM vfile WHERE id=%d",
295300
vid, idm
296301
);
297302
idv = db_last_insert_rowid();
298303
db_multi_exec("UPDATE fv SET idv=%d WHERE rowid=%d", idv, rowid);
299304
zName = db_column_text(&q, 2);
@@ -332,11 +337,11 @@
332337
333338
/*
334339
** Do a three-way merge on files that have changes on both P->M and P->V.
335340
*/
336341
db_prepare(&q,
337
- "SELECT ridm, idv, ridp, ridv, %s, fn FROM fv"
342
+ "SELECT ridm, idv, ridp, ridv, %s, fn, isexe FROM fv"
338343
" WHERE idp>0 AND idv>0 AND idm>0"
339344
" AND ridm!=ridp AND (ridv!=ridp OR chnged)",
340345
glob_expr("fv.fn", zBinGlob)
341346
);
342347
while( db_step(&q)==SQLITE_ROW ){
@@ -344,10 +349,11 @@
344349
int idv = db_column_int(&q, 1);
345350
int ridp = db_column_int(&q, 2);
346351
int ridv = db_column_int(&q, 3);
347352
int isBinary = db_column_int(&q, 4);
348353
const char *zName = db_column_text(&q, 5);
354
+ int isExe = db_column_int(&q, 6);
349355
int rc;
350356
char *zFullPath;
351357
Blob m, p, r;
352358
/* Do a 3-way merge of idp->idm into idp->idv. The results go into idv. */
353359
if( detailFlag ){
@@ -366,10 +372,11 @@
366372
rc = merge_3way(&p, zFullPath, &m, &r);
367373
}
368374
if( rc>=0 ){
369375
if( !nochangeFlag ){
370376
blob_write_to_file(&r, zFullPath);
377
+ file_setexe(zFullPath, isExe);
371378
}
372379
db_multi_exec("UPDATE vfile SET mtime=0 WHERE id=%d", idv);
373380
if( rc>0 ){
374381
printf("***** %d merge conflicts in %s\n", rc, zName);
375382
nConflict++;
376383
--- src/merge.c
+++ src/merge.c
@@ -158,20 +158,22 @@
158 " idm INTEGER," /* VFILE entry for version merging in */
159 " chnged BOOLEAN," /* True if current version has been edited */
160 " ridv INTEGER," /* Record ID for current version */
161 " ridp INTEGER," /* Record ID for pivot */
162 " ridm INTEGER," /* Record ID for merge */
 
163 " fnp TEXT," /* The filename in the pivot */
164 " fnm TEXT" /* the filename in the merged version */
165 ");"
166 );
167
168 /* Add files found in V
169 */
170 db_multi_exec(
171 "INSERT OR IGNORE INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,chnged)"
172 " SELECT pathname, pathname, pathname, id, 0, 0, rid, 0, 0, chnged "
 
173 " FROM vfile WHERE vid=%d",
174 vid
175 );
176
177 /*
@@ -194,12 +196,13 @@
194 }
195
196 /* Add files found in P but not in V
197 */
198 db_multi_exec(
199 "INSERT OR IGNORE INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,chnged)"
200 " SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, 0 "
 
201 " FROM vfile"
202 " WHERE vid=%d AND pathname NOT IN (SELECT fnp FROM fv)",
203 pid
204 );
205
@@ -220,12 +223,13 @@
220 }
221
222 /* Add files found in M but not in P or V.
223 */
224 db_multi_exec(
225 "INSERT OR IGNORE INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,chnged)"
226 " SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, 0 "
 
227 " FROM vfile"
228 " WHERE vid=%d"
229 " AND pathname NOT IN (SELECT fnp FROM fv UNION SELECT fnm FROM fv)",
230 mid
231 );
@@ -242,19 +246,20 @@
242 pid, pid, mid, mid
243 );
244
245 if( debugFlag ){
246 db_prepare(&q,
247 "SELECT rowid, fn, fnp, fnm, chnged, ridv, ridp, ridm FROM fv"
248 );
249 while( db_step(&q)==SQLITE_ROW ){
250 printf("%3d: ridv=%-4d ridp=%-4d ridm=%-4d chnged=%d\n",
251 db_column_int(&q, 0),
252 db_column_int(&q, 5),
253 db_column_int(&q, 6),
254 db_column_int(&q, 7),
255 db_column_int(&q, 4));
 
256 printf(" fn = [%s]\n", db_column_text(&q, 1));
257 printf(" fnp = [%s]\n", db_column_text(&q, 2));
258 printf(" fnm = [%s]\n", db_column_text(&q, 3));
259 }
260 db_finalize(&q);
@@ -288,12 +293,12 @@
288 int idm = db_column_int(&q, 0);
289 int rowid = db_column_int(&q, 1);
290 int idv;
291 const char *zName;
292 db_multi_exec(
293 "INSERT INTO vfile(vid,chnged,deleted,rid,mrid,pathname)"
294 " SELECT %d,3,0,rid,mrid,pathname FROM vfile WHERE id=%d",
295 vid, idm
296 );
297 idv = db_last_insert_rowid();
298 db_multi_exec("UPDATE fv SET idv=%d WHERE rowid=%d", idv, rowid);
299 zName = db_column_text(&q, 2);
@@ -332,11 +337,11 @@
332
333 /*
334 ** Do a three-way merge on files that have changes on both P->M and P->V.
335 */
336 db_prepare(&q,
337 "SELECT ridm, idv, ridp, ridv, %s, fn FROM fv"
338 " WHERE idp>0 AND idv>0 AND idm>0"
339 " AND ridm!=ridp AND (ridv!=ridp OR chnged)",
340 glob_expr("fv.fn", zBinGlob)
341 );
342 while( db_step(&q)==SQLITE_ROW ){
@@ -344,10 +349,11 @@
344 int idv = db_column_int(&q, 1);
345 int ridp = db_column_int(&q, 2);
346 int ridv = db_column_int(&q, 3);
347 int isBinary = db_column_int(&q, 4);
348 const char *zName = db_column_text(&q, 5);
 
349 int rc;
350 char *zFullPath;
351 Blob m, p, r;
352 /* Do a 3-way merge of idp->idm into idp->idv. The results go into idv. */
353 if( detailFlag ){
@@ -366,10 +372,11 @@
366 rc = merge_3way(&p, zFullPath, &m, &r);
367 }
368 if( rc>=0 ){
369 if( !nochangeFlag ){
370 blob_write_to_file(&r, zFullPath);
 
371 }
372 db_multi_exec("UPDATE vfile SET mtime=0 WHERE id=%d", idv);
373 if( rc>0 ){
374 printf("***** %d merge conflicts in %s\n", rc, zName);
375 nConflict++;
376
--- src/merge.c
+++ src/merge.c
@@ -158,20 +158,22 @@
158 " idm INTEGER," /* VFILE entry for version merging in */
159 " chnged BOOLEAN," /* True if current version has been edited */
160 " ridv INTEGER," /* Record ID for current version */
161 " ridp INTEGER," /* Record ID for pivot */
162 " ridm INTEGER," /* Record ID for merge */
163 " isexe BOOLEAN," /* Execute permission enabled */
164 " fnp TEXT," /* The filename in the pivot */
165 " fnm TEXT" /* the filename in the merged version */
166 ");"
167 );
168
169 /* Add files found in V
170 */
171 db_multi_exec(
172 "INSERT OR IGNORE"
173 " INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,isexe,chnged)"
174 " SELECT pathname, pathname, pathname, id, 0, 0, rid, 0, 0, isexe, chnged "
175 " FROM vfile WHERE vid=%d",
176 vid
177 );
178
179 /*
@@ -194,12 +196,13 @@
196 }
197
198 /* Add files found in P but not in V
199 */
200 db_multi_exec(
201 "INSERT OR IGNORE"
202 " INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,isexe,chnged)"
203 " SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, isexe, 0 "
204 " FROM vfile"
205 " WHERE vid=%d AND pathname NOT IN (SELECT fnp FROM fv)",
206 pid
207 );
208
@@ -220,12 +223,13 @@
223 }
224
225 /* Add files found in M but not in P or V.
226 */
227 db_multi_exec(
228 "INSERT OR IGNORE"
229 " INTO fv(fn,fnp,fnm,idv,idp,idm,ridv,ridp,ridm,isexe,chnged)"
230 " SELECT pathname, pathname, pathname, 0, 0, 0, 0, 0, 0, isexe, 0 "
231 " FROM vfile"
232 " WHERE vid=%d"
233 " AND pathname NOT IN (SELECT fnp FROM fv UNION SELECT fnm FROM fv)",
234 mid
235 );
@@ -242,19 +246,20 @@
246 pid, pid, mid, mid
247 );
248
249 if( debugFlag ){
250 db_prepare(&q,
251 "SELECT rowid, fn, fnp, fnm, chnged, ridv, ridp, ridm, isexe FROM fv"
252 );
253 while( db_step(&q)==SQLITE_ROW ){
254 printf("%3d: ridv=%-4d ridp=%-4d ridm=%-4d chnged=%d isexe=%d\n",
255 db_column_int(&q, 0),
256 db_column_int(&q, 5),
257 db_column_int(&q, 6),
258 db_column_int(&q, 7),
259 db_column_int(&q, 4),
260 db_column_int(&q, 8));
261 printf(" fn = [%s]\n", db_column_text(&q, 1));
262 printf(" fnp = [%s]\n", db_column_text(&q, 2));
263 printf(" fnm = [%s]\n", db_column_text(&q, 3));
264 }
265 db_finalize(&q);
@@ -288,12 +293,12 @@
293 int idm = db_column_int(&q, 0);
294 int rowid = db_column_int(&q, 1);
295 int idv;
296 const char *zName;
297 db_multi_exec(
298 "INSERT INTO vfile(vid,chnged,deleted,rid,mrid,isexe,pathname)"
299 " SELECT %d,3,0,rid,mrid,isexe,pathname FROM vfile WHERE id=%d",
300 vid, idm
301 );
302 idv = db_last_insert_rowid();
303 db_multi_exec("UPDATE fv SET idv=%d WHERE rowid=%d", idv, rowid);
304 zName = db_column_text(&q, 2);
@@ -332,11 +337,11 @@
337
338 /*
339 ** Do a three-way merge on files that have changes on both P->M and P->V.
340 */
341 db_prepare(&q,
342 "SELECT ridm, idv, ridp, ridv, %s, fn, isexe FROM fv"
343 " WHERE idp>0 AND idv>0 AND idm>0"
344 " AND ridm!=ridp AND (ridv!=ridp OR chnged)",
345 glob_expr("fv.fn", zBinGlob)
346 );
347 while( db_step(&q)==SQLITE_ROW ){
@@ -344,10 +349,11 @@
349 int idv = db_column_int(&q, 1);
350 int ridp = db_column_int(&q, 2);
351 int ridv = db_column_int(&q, 3);
352 int isBinary = db_column_int(&q, 4);
353 const char *zName = db_column_text(&q, 5);
354 int isExe = db_column_int(&q, 6);
355 int rc;
356 char *zFullPath;
357 Blob m, p, r;
358 /* Do a 3-way merge of idp->idm into idp->idv. The results go into idv. */
359 if( detailFlag ){
@@ -366,10 +372,11 @@
372 rc = merge_3way(&p, zFullPath, &m, &r);
373 }
374 if( rc>=0 ){
375 if( !nochangeFlag ){
376 blob_write_to_file(&r, zFullPath);
377 file_setexe(zFullPath, isExe);
378 }
379 db_multi_exec("UPDATE vfile SET mtime=0 WHERE id=%d", idv);
380 if( rc>0 ){
381 printf("***** %d merge conflicts in %s\n", rc, zName);
382 nConflict++;
383

Keyboard Shortcuts

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