<pre style='margin:0'>
Rainer Müller (raimue) pushed a commit to branch vcs-fetch
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/00d9c7e32c72811ba44423344f5bc653912bb413">https://github.com/macports/macports-base/commit/00d9c7e32c72811ba44423344f5bc653912bb413</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 00d9c7e32c72811ba44423344f5bc653912bb413
</span>Author: Rainer Müller <raimue@macports.org>
AuthorDate: Mon Mar 19 00:36:16 2018 +0100

<span style='display:block; white-space:pre;color:#404040;'>    fetch: Enable tarball generation for cvs
</span>---
 src/port1.0/portfetch.tcl | 113 ++++++++++++++++++++++++++++++++++------------
 1 file changed, 84 insertions(+), 29 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portfetch.tcl b/src/port1.0/portfetch.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 0532ffc..a5e3ceb 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portfetch.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portfetch.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -50,15 +50,11 @@ options master_sites patch_sites extract.suffix distfiles patchfiles use_bzip2 u
</span>     fetch.type fetch.user fetch.password fetch.use_epsv fetch.ignore_sslcert \
     master_sites.mirror_subdir patch_sites.mirror_subdir \
     bzr.url bzr.revision bzr.file bzr.file_prefix \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    cvs.module cvs.root cvs.password cvs.date cvs.tag cvs.method \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    cvs.module cvs.root cvs.password cvs.date cvs.tag cvs.file cvs.file_prefix \
</span>     svn.cmd svn.url svn.revision svn.method svn.pre_args svn.args svn.post_args svn.file svn.file_prefix \
     git.cmd git.url git.branch git.file git.file_prefix git.fetch_submodules \
     hg.cmd hg.url hg.tag hg.file hg.file_prefix
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# XXX we use the command framework to buy us some useful features,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# but this is not a user-modifiable command
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-commands cvs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> # Defaults
 default extract.suffix .tar.gz
 default fetch.type standard
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -75,14 +71,14 @@ default bzr.file_prefix {${distname}}
</span> default cvs.cmd {[findBinary cvs $portutil::autoconf::cvs_path]}
 default cvs.password ""
 default cvs.dir {${workpath}}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-default cvs.method {export}
</span> default cvs.module {$distname}
 default cvs.tag ""
 default cvs.date ""
<span style='display:block; white-space:pre;background:#ffe0e0;'>-default cvs.env {CVS_PASSFILE=${workpath}/.cvspass}
</span> default cvs.pre_args {"-z9 -f -d ${cvs.root}"}
 default cvs.args ""
 default cvs.post_args {"${cvs.module}"}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+default cvs.file {${distname}.${fetch.type}.tar.bz2}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default cvs.file_prefix {${distname}}
</span> 
 default svn.cmd {[portfetch::find_svn_path]}
 default svn.dir {${workpath}}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -187,6 +183,7 @@ proc portfetch::set_fetch_type {option action args} {
</span>             }
             cvs {
                 depends_fetch-append bin:cvs:cvs
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                default distname {${name}-${cvs.tag}${cvs.date}}
</span>             }
             svn {
                 # Sierra is the first macOS version whose svn supports modern TLS cipher suites.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -212,6 +209,7 @@ proc portfetch::set_fetch_type {option action args} {
</span> 
         switch $args {
             bzr -
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            cvs -
</span>             svn -
             git -
             hg {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -476,12 +474,18 @@ proc portfetch::bzrfetch {args} {
</span> # Perform a CVS login and fetch, storing the CVS login
 # information in a custom .cvspass file
 proc portfetch::cvsfetch {args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global workpath cvs.env cvs.cmd cvs.args cvs.post_args \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           cvs.root cvs.date cvs.tag cvs.method cvs.password
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           patch_sites filespath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global UI_PREFIX \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           env distpath workpath worksrcpath \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           cvs.cmd cvs.pre_args cvs.args cvs.post_args cvs.root cvs.tag cvs.date cvs.password cvs.file cvs.file_prefix \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           name distname fetch.type \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set generatedfile "${distpath}/${cvs.file}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[cvs_tarballable] && [file isfile "${generatedfile}"]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set cvs.args "${cvs.method} ${cvs.args}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {${cvs.method} eq "export" && ![string length ${cvs.tag}] && ![string length ${cvs.date}]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![string length ${cvs.tag}] && ![string length ${cvs.date}]} {
</span>         set cvs.tag "HEAD"
     }
     if {[string length ${cvs.tag}]} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -492,25 +496,65 @@ proc portfetch::cvsfetch {args} {
</span>         set cvs.args "${cvs.args} -D ${cvs.date}"
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[regexp ^:pserver: ${cvs.root}]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set savecmd ${cvs.cmd}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set saveargs ${cvs.args}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set savepost_args ${cvs.post_args}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set cvs.cmd "echo ${cvs.password} | ${cvs.cmd}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set cvs.args login
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set cvs.post_args ""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[catch {command_exec cvs -notty "" "2>&1"} result]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return -code error [msgcat::mc "CVS login failed"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ui_info "$UI_PREFIX Checking out ${fetch.type} repository"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array set orig_env [array get env]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # create an empty passfile to suppress warnings from CVS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    close [open "$env(HOME)/.cvspass" w]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    try -pass_signal {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[regexp ^:pserver: ${cvs.root}]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set cmdstring "echo ${cvs.password} | ${cvs.cmd} ${cvs.pre_args} login 2>&1"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[catch {system -notty $cmdstring} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                error [msgcat::mc "CVS login failed: $result"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set env(CVS_RSH) ssh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set tmppath [mkdtemp "/tmp/macports.portfetch.${name}.XXXXXXXX"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set tmpxprt [file join ${tmppath} export]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        file mkdir ${tmpxprt}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set cmdstring "${cvs.cmd} ${cvs.pre_args} export -d ${cvs.file_prefix} ${cvs.args} ${cvs.post_args} 2>&1"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[catch {system -notty -W ${tmpxprt} $cmdstring} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            delete ${tmppath}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            error [msgcat::mc "CVS checkout failed"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {![cvs_tarballable]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            file rename ${tmpxprt}/${svn.file_prefix} ${worksrcpath}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return 0
</span>         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set cvs.cmd ${savecmd}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set cvs.args ${saveargs}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set cvs.post_args ${savepost_args}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set env(CVS_RSH) ssh
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[catch {command_exec cvs "" "2>&1"} result]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return -code error [msgcat::mc "CVS check out failed"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_info "$UI_PREFIX Generating tarball ${cvs.file}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # get timestamp by looking for the newest file in the exported source
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set mtime 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        fs-traverse f ${tmpxprt}/${cvs.file_prefix} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![file isdirectory $f]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set ft [file mtime $f]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {$ft > $mtime} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set mtime $ft
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set tardst [join [list [mktemp "/tmp/macports.portfetch.${name}.XXXXXXXX"] ".tar"] ""]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        mktar $tardst $tmpxprt $mtime
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set compressed [compressfile ${tardst}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        file rename -force ${compressed} ${generatedfile}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_debug "Created tarball for fetch.type ${fetch.type} at ${generatedfile}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } catch {{*} ecode emessage} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        throw
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } finally {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # cleanup
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        delete ${tmppath}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array unset env *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array set env [array get orig_env]
</span>     }
 
     return 0
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -614,6 +658,16 @@ proc portfetch::bzr_tarballable {args} {
</span>     }
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# Check if a tarball can be produced for cvs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portfetch::cvs_tarballable {args} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global cvs.tag cvs.date
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {${cvs.tag} ni {"HEAD" ""} || ${cvs.date} ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # Check if a tarball can be produced for svn
 proc portfetch::svn_tarballable {args} {
     global svn.revision
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -660,6 +714,7 @@ proc portfetch::mirrorable {args} {
</span>     global fetch.type checksums
     switch -- "${fetch.type}" {
         bzr -
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        cvs -
</span>         svn -
         git -
         hg {
</pre><pre style='margin:0'>

</pre>