Improve the shell tool ".ar --list --verbose" command.
FossilOrigin-Name: b64681a644c419bb98d00980a6cb56ef5a0aff5ef5321955631f0b4c88aac283
This commit is contained in:
parent
5a78b81b1b
commit
b5090e4897
@ -50,6 +50,9 @@ typedef unsigned long u32;
|
||||
|
||||
#define ZIPFILE_BUFFER_SIZE (64*1024)
|
||||
|
||||
|
||||
#define ZIPFILE_EXTRA_TIMESTAMP 0x5455
|
||||
|
||||
/*
|
||||
** Set the error message contained in context ctx to the results of
|
||||
** vprintf(zFmt, ...).
|
||||
@ -341,7 +344,14 @@ static int zipfileReadCDS(ZipfileCsr *pCsr){
|
||||
pCsr->iNextOff += pCsr->cds.nComment;
|
||||
}
|
||||
|
||||
/* Scan the "extra" fields */
|
||||
/* Scan the cds.nExtra bytes of "extra" fields for any that can
|
||||
** be interpreted. The general format of an extra field is:
|
||||
**
|
||||
** Header ID 2 bytes
|
||||
** Data Size 2 bytes
|
||||
** Data N bytes
|
||||
**
|
||||
*/
|
||||
if( rc==SQLITE_OK ){
|
||||
u8 *p = &aRead[pCsr->cds.nFile];
|
||||
u8 *pEnd = &p[pCsr->cds.nExtra];
|
||||
@ -351,7 +361,7 @@ static int zipfileReadCDS(ZipfileCsr *pCsr){
|
||||
u16 nByte = zipfileRead16(p);
|
||||
|
||||
switch( id ){
|
||||
case 0x5455: { /* Extended timestamp */
|
||||
case ZIPFILE_EXTRA_TIMESTAMP: {
|
||||
u8 b = p[0];
|
||||
if( b & 0x01 ){ /* 0x01 -> modtime is present */
|
||||
pCsr->mTime = zipfileGetU32(&p[1]);
|
||||
@ -359,9 +369,6 @@ static int zipfileReadCDS(ZipfileCsr *pCsr){
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x7875: /* Info-ZIP Unix (new) */
|
||||
break;
|
||||
}
|
||||
|
||||
p += nByte;
|
||||
|
14
manifest
14
manifest
@ -1,5 +1,5 @@
|
||||
C Have\sthe\sshell\stool\s".ar\s--list"\sand\s".ar\s--extract"\scommands\ssupport\szip\nfiles.\sCurrently\sthe\s"-zip"\sswitch\sis\srequired.
|
||||
D 2017-12-27T18:54:11.166
|
||||
C Improve\sthe\sshell\stool\s".ar\s--list\s--verbose"\scommand.
|
||||
D 2017-12-27T21:13:21.423
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F Makefile.in ceb40bfcb30ebba8e1202b34c56ff7e13e112f9809e2381d99be32c2726058f5
|
||||
@ -302,7 +302,7 @@ F ext/misc/vfsstat.c bf10ef0bc51e1ad6756629e1edb142f7a8db1178
|
||||
F ext/misc/vtablog.c 31d0d8f4406795679dcd3a67917c213d3a2a5fb3ea5de35f6e773491ed7e13c9
|
||||
F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd
|
||||
F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212
|
||||
F ext/misc/zipfile.c 96148b78b56664fe82f774e50dcdf6c83d693a1449b88011eba00cd6c697fedf
|
||||
F ext/misc/zipfile.c ced1aa768904cf8182c3da93d42df4e3cf30fe7a2e66c9216f6bc64a8df4fd5b
|
||||
F ext/rbu/rbu.c ea7d1b7eb44c123a2a619332e19fe5313500705c4a58aaa1887905c0d83ffc2e
|
||||
F ext/rbu/rbu1.test 43836fac8c7179a358eaf38a8a1ef3d6e6285842
|
||||
F ext/rbu/rbu10.test 1846519a438697f45e9dcb246908af81b551c29e1078d0304fae83f1fed7e9ee
|
||||
@ -483,7 +483,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
||||
F src/resolve.c bbee7e31d369a18a2f4836644769882e9c5d40ef4a3af911db06410b65cb3730
|
||||
F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
|
||||
F src/select.c 8b22abe193e4d8243befa2038e4ae2405802fed1c446e5e502d11f652e09ba74
|
||||
F src/shell.c.in d1be3030ee7afbbfb67972e4614b6d08dcae2e76460114d6b200fd28d0f008fb
|
||||
F src/shell.c.in 9177b6cc706b1dd1ed81b05344641597d7ed8bba97a8fc31192309189846fab7
|
||||
F src/sqlite.h.in 2126192945019d4cdce335cb236b440a05ec75c93e4cd94c9c6d6e7fcc654cc4
|
||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||
F src/sqlite3ext.h c02d628cca67f3889c689d82d25c3eb45e2c155db08e4c6089b5840d64687d34
|
||||
@ -1692,7 +1692,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P 8e366b99b13d765d8bf000a7ec5919e582702e51dc07c27a746b6002898a2302
|
||||
R 0d0cb33644ad535bd9f83812fd2ec78d
|
||||
P a532a0f6fd59e81086d46f09151ba7fb26725198231d902c71d0f95cb01dbe91
|
||||
R 7075030d907b0ffe212621eb709bb967
|
||||
U dan
|
||||
Z 54715bdb695d1dc399a9b1cd512f6d24
|
||||
Z 1c430e112380037cc2bfad44bf8be92e
|
||||
|
@ -1 +1 @@
|
||||
a532a0f6fd59e81086d46f09151ba7fb26725198231d902c71d0f95cb01dbe91
|
||||
b64681a644c419bb98d00980a6cb56ef5a0aff5ef5321955631f0b4c88aac283
|
@ -4577,12 +4577,43 @@ static void arWhereClause(
|
||||
*pzWhere = zWhere;
|
||||
}
|
||||
|
||||
/*
|
||||
** Argument zMode must point to a buffer at least 11 bytes in size. This
|
||||
** function populates this buffer with the string interpretation of
|
||||
** the unix file mode passed as the second argument (e.g. "drwxr-xr-x").
|
||||
*/
|
||||
static void shellModeToString(char *zMode, int mode){
|
||||
int i;
|
||||
|
||||
/* Magic numbers copied from [man 2 stat] */
|
||||
if( mode & 0040000 ){
|
||||
zMode[0] = 'd';
|
||||
}else if( (mode & 0120000)==0120000 ){
|
||||
zMode[0] = 'l';
|
||||
}else{
|
||||
zMode[0] = '-';
|
||||
}
|
||||
|
||||
for(i=0; i<3; i++){
|
||||
int m = (mode >> ((2-i)*3));
|
||||
char *a = &zMode[1 + i*3];
|
||||
a[0] = (m & 0x4) ? 'r' : '-';
|
||||
a[1] = (m & 0x2) ? 'w' : '-';
|
||||
a[2] = (m & 0x1) ? 'x' : '-';
|
||||
}
|
||||
zMode[10] = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
** Implementation of .ar "lisT" command.
|
||||
*/
|
||||
static int arListCommand(ShellState *p, sqlite3 *db, ArCommand *pAr){
|
||||
const char *zSql = "SELECT name FROM %s WHERE %s";
|
||||
const char *zSql = "SELECT %s FROM %s WHERE %s";
|
||||
const char *zTbl = (pAr->bZip ? "zipfile(?)" : "sqlar");
|
||||
const char *azCols[] = {
|
||||
"name",
|
||||
"mode, sz, datetime(mtime, 'unixepoch'), name"
|
||||
};
|
||||
|
||||
char *zWhere = 0;
|
||||
sqlite3_stmt *pSql = 0;
|
||||
@ -4591,12 +4622,23 @@ static int arListCommand(ShellState *p, sqlite3 *db, ArCommand *pAr){
|
||||
rc = arCheckEntries(db, pAr);
|
||||
arWhereClause(&rc, pAr, &zWhere);
|
||||
|
||||
shellPreparePrintf(db, &rc, &pSql, zSql, zTbl, zWhere);
|
||||
shellPreparePrintf(db, &rc, &pSql, zSql, azCols[pAr->bVerbose], zTbl, zWhere);
|
||||
if( rc==SQLITE_OK && pAr->bZip ){
|
||||
sqlite3_bind_text(pSql, 1, pAr->zFile, -1, SQLITE_TRANSIENT);
|
||||
}
|
||||
while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
|
||||
raw_printf(p->out, "%s\n", sqlite3_column_text(pSql, 0));
|
||||
if( pAr->bVerbose ){
|
||||
char zMode[11];
|
||||
shellModeToString(zMode, sqlite3_column_int(pSql, 0));
|
||||
|
||||
raw_printf(p->out, "%s % 10d %s %s\n", zMode,
|
||||
sqlite3_column_int(pSql, 1),
|
||||
sqlite3_column_text(pSql, 2),
|
||||
sqlite3_column_text(pSql, 3)
|
||||
);
|
||||
}else{
|
||||
raw_printf(p->out, "%s\n", sqlite3_column_text(pSql, 0));
|
||||
}
|
||||
}
|
||||
|
||||
shellFinalize(&rc, pSql);
|
||||
|
Loading…
x
Reference in New Issue
Block a user