hi there,

the motivation for this patch was that the zip and tarball links
from the web ui get a filename and checkout "for free", while they
are a mandatory parameters for the command line.

so i tried to unify it a bit: the default archive name is now both
from web and cli the same, a lowercased project name followed by the
artifact ID.  spaces are substituted with '-'.

$ fossil zip
fossil-030035345c.zip: 2944427 bytes

$ fossil zip tip
fossil-030035345c.zip: 2944427 bytes

$ fossil zip -o f.zip
f.zip: 2944427 bytes

$ fossil zip -o f.zip tip
f.zip: 2944427 bytes

$ fossil tar
fossil-030035345c.tgz: 2944427 bytes

$ fossil tar tip
fossil-030035345c.tgz: 2944427 bytes

$ fossil tar -o f.tgz
f.zip: 2944427 bytes

$ fossil tar -o f.tgz tip
f.zip: 2944427 bytes


$ fossil help zip
Usage: fossil zip [--name DIRECTORY] [-o OUTPUTFILE]
                  [-R REPOSITORY] [VERSION]

Generate a ZIP archive containing VERSION of the checkout.
If VERSION is omitted, the current checkout is used.

The name of the resulting archive can be set using the -o option,
otherwise it will be derived from the project name followed by the
check-in's artifact ID.  Unless the --name option is specified, the
the top-level directory inside the archive will have the same name.

Options:
  --name DIRECTORY      Name of the top-level directory inside
                        the archive.
  -o OUTPUTFILE         Name of the archive.
  -R|--repository FILE  Use the repository in FILE.

See also: tarball



--- src/info.c
+++ src/info.c
@@ -500,11 +500,18 @@
         @ <td>%h(zUser) @ %h(zIpAddr) on %s(zDate)</td></tr>
       }
       db_finalize(&q);
     }
     if( g.perm.History ){
-      const char *zProjName = db_get("project-name", "unnamed");
+      char *zProjName = db_get("project-name", "unnamed");
+      int i;
+      for(i=0; i<strlen(zProjName); i++){
+        zProjName[i] = fossil_tolower(zProjName[i]);
+        if( zProjName[i]==' ' ){
+         zProjName[i] = '-';
+       }
+      }
       @ <tr><th>Timelines:</th><td>
       @   <a href="%s(g.zTop)/timeline?f=%S(zUuid)">family</a>
       if( zParent ){
         @ | <a href="%s(g.zTop)/timeline?p=%S(zUuid)">ancestors</a>
       }
@@ -526,16 +533,14 @@
       @ </td></tr>
       @ <tr><th>Other&nbsp;Links:</th>
       @   <td>
       @     <a href="%s(g.zTop)/dir?ci=%S(zUuid)">files</a>
       if( g.perm.Zip ){
-        char *zUrl = mprintf("%s/tarball/%s-%S.tar.gz?uuid=%s",
-                             g.zTop, zProjName, zUuid, zUuid);
-        @ | <a href="%s(zUrl)">Tarball</a>
+        @ | <a href="%s(g.zTop)/tarball/%s(zProjName)-%S(zUuid).tgz=%s(zUuid)">
+        @         Tarball</a>
         @ | <a 
href="%s(g.zTop)/zip/%s(zProjName)-%S(zUuid).zip?uuid=%s(zUuid)">
         @         ZIP archive</a>
-        fossil_free(zUrl);
       }
       @   | <a href="%s(g.zTop)/artifact/%S(zUuid)">manifest</a>
       if( g.perm.Write ){
         @   | <a href="%s(g.zTop)/ci_edit?r=%S(zUuid)">edit</a>
       }

--- src/tar.c
+++ src/tar.c
@@ -525,42 +525,63 @@
 }
 
 /*
 ** COMMAND: tarball*
 **
-** Usage: %fossil tarball VERSION OUTPUTFILE [--name DIRECTORYNAME] 
[-R|--repository REPO]
+** Usage: %fossil tarball [--name DIRECTORY] [-o OUTPUTFILE]
+**                       [-R REPOSITORY] VERSION
+**
+** Generate a compressed tarball archive containing VERSION of the
+** project.  If VERSION is omitted, the current checkout is used.
+**
+** The name of the resulting archive can be set using the -o option,
+** otherwise it will be derived from the project name followed by the
+** check-in's artifact ID.  Unless the --name option is specified, the
+** the top-level directory inside the archive will have the same name.
+**
+** Options:
+**   --name DIRECTORY      Name of the top-level directory inside
+**                         the archive.
+**   -o OUTPUTFILE         Name of the archive.
+**   -R|--repository FILE  Use the repository in FILE.
 **
-** Generate a compressed tarball for a specified version.  If the --name
-** option is used, its argument becomes the name of the top-level directory
-** in the resulting tarball.  If --name is omitted, the top-level directory
-** named is derived from the project name, the check-in date and time, and
-** the artifact ID of the check-in.
+** See also: zip
 */
 void tarball_cmd(void){
   int rid;
   Blob tarball;
   const char *zName;
+  const char *fName;
+  int wrote;
   zName = find_option("name", 0, 1);
+  fName = find_option("o", "o", 1);
   db_find_and_open_repository(0, 0);
-  if( g.argc!=4 ){
-    usage("VERSION OUTPUTFILE");
+  if( g.argc!=2 && g.argc!=3 ){
+    usage("[--name DIRECTORY] [-o OUTPUTFILE] [-R REPOSITORY] [VERSION]");
   }
-  rid = name_to_typed_rid(g.argv[2], "ci");
+  if( g.argc==3 ){
+    rid = name_to_typed_rid(g.argv[2], "ci");
+  }else{
+    rid = db_lget_int("checkout",0);
+  }
   if( zName==0 ){
-    zName = db_text("default-name",
-       "SELECT replace(%Q,' ','_') "
-          " || strftime('_%%Y-%%m-%%d_%%H%%M%%S_', event.mtime) "
+    zName = db_text("unnamed",
+       "SELECT lower(replace(%Q,' ','-')) "
+          " || '-' "
           " || substr(blob.uuid, 1, 10)"
        "  FROM event, blob"
        " WHERE event.objid=%d"
        "   AND blob.rid=%d",
        db_get("project-name", "unnamed"), rid, rid
     );
   }
+  if( fName==0 ){
+    fName = mprintf("%s.tgz", zName);
+  }
   tarball_of_checkin(rid, &tarball, zName);
-  blob_write_to_file(&tarball, g.argv[3]);
-  blob_reset(&tarball);
+  wrote = blob_write_to_file(&tarball, fName);
+  fossil_print("%s: %d bytes\n", fName, wrote);
 }
 
 /*
 ** WEBPAGE: tarball
 ** URL: /tarball/RID.tar.gz
@@ -578,16 +599,16 @@
   if( !g.perm.Zip ){ login_needed(); return; }
   zName = mprintf("%s", PD("name",""));
   nName = strlen(zName);
   zRid = mprintf("%s", PD("uuid",""));
   nRid = strlen(zRid);
-  if( nName>7 && fossil_strcmp(&zName[nName-7], ".tar.gz")==0 ){
-    /* Special case:  Remove the ".tar.gz" suffix.  */
-    nName -= 7;
+  if( nName>4 && fossil_strcmp(&zName[nName-4], ".tgz")==0 ){
+    /* Special case:  Remove the ".tgz" suffix.  */
+    nName -= 4;
     zName[nName] = 0;
   }else{
-    /* If the file suffix is not ".tar.gz" then just remove the
+    /* If the file suffix is not ".tgz" then just remove the
     ** suffix up to and including the last "." */
     for(nName=strlen(zName)-1; nName>5; nName--){
       if( zName[nName]=='.' ){
         zName[nName] = 0;
         break;

--- src/zip.c
+++ src/zip.c
@@ -379,41 +379,63 @@
 }
 
 /*
 ** COMMAND: zip*
 **
-** Usage: %fossil zip VERSION OUTPUTFILE [--name DIRECTORYNAME] 
[-R|--repository REPO]
+** Usage: %fossil zip [--name DIRECTORY] [-o OUTPUTFILE]
+**                   [-R REPOSITORY] [VERSION]
+**
+** Generate a ZIP archive containing VERSION of the checkout.
+** If VERSION is omitted, the current checkout is used.
+**
+** The name of the resulting archive can be set using the -o option,
+** otherwise it will be derived from the project name followed by the
+** check-in's artifact ID.  Unless the --name option is specified, the
+** the top-level directory inside the archive will have the same name.
+**
+** Options:
+**   --name DIRECTORY      Name of the top-level directory inside
+**                         the archive.
+**   -o OUTPUTFILE         Name of the archive.
+**   -R|--repository FILE  Use the repository in FILE.
 **
-** Generate a ZIP archive for a specified version.  If the --name option is
-** used, it argument becomes the name of the top-level directory in the
-** resulting ZIP archive.  If --name is omitted, the top-level directory
-** named is derived from the project name, the check-in date and time, and
-** the artifact ID of the check-in.
+** See also: tarball
 */
 void baseline_zip_cmd(void){
   int rid;
   Blob zip;
   const char *zName;
+  const char *fName;
+  int wrote;
   zName = find_option("name", 0, 1);
+  fName = find_option("o", "o", 1);
   db_find_and_open_repository(0, 0);
-  if( g.argc!=4 ){
-    usage("VERSION OUTPUTFILE");
+  if( g.argc!=2 && g.argc!=3 ){
+    usage("[--name DIRECTORY] [-o OUTPUTFILE] [-R REPOSITORY] [VERSION]");
   }
-  rid = name_to_typed_rid(g.argv[2],"ci");
+  if( g.argc==3 ){
+    rid = name_to_typed_rid(g.argv[2], "ci");
+  }else{
+    rid = db_lget_int("checkout",0);
+  }
   if( zName==0 ){
-    zName = db_text("default-name",
-       "SELECT replace(%Q,' ','_') "
-          " || strftime('_%%Y-%%m-%%d_%%H%%M%%S_', event.mtime) "
+    zName = db_text("unnamed",
+       "SELECT lower(replace(%Q,' ','-')) "
+          " || '-' "
           " || substr(blob.uuid, 1, 10)"
        "  FROM event, blob"
        " WHERE event.objid=%d"
        "   AND blob.rid=%d",
        db_get("project-name", "unnamed"), rid, rid
     );
   }
+  if( fName==0 ){
+    fName = mprintf("%s.zip", zName);
+  }
   zip_of_baseline(rid, &zip, zName);
-  blob_write_to_file(&zip, g.argv[3]);
+  wrote = blob_write_to_file(&zip, fName);
+  fossil_print("%s: %d bytes\n", fName, wrote);
 }
 
 /*
 ** WEBPAGE: zip
 ** URL: /zip/RID.zip


-- 
Introibo ad altare Dei.
_______________________________________________
fossil-users mailing list
fossil-users@lists.fossil-scm.org
http://lists.fossil-scm.org:8080/cgi-bin/mailman/listinfo/fossil-users

Reply via email to