On Fri, 15 May 2026 21:16:37 +0200
Gareth de Vaux <[email protected]> wrote:

> On Fri 2026-05-15 (20:36), Daniel Engberg wrote:
> > I'm going to guess that your tree has stray work-dirs left because of the
> > bootstrapping which confuses the framework (these do not get removed by make
> > clean or clean-depends).
> > 
> > rm -rf /usr/ports/*/*/work && rm -rf /usr/ports/*/*/work-*
> 
> Great thanks, that worked :) I'd done 'portsclean -C' but that evidently 
> doesn't
> clean everything.

Do you habitally run `portsdb -Uu`? (If you're always running
`make index` at /usr/ports after updating ports tree, it can be
`portsdb -u`.) portsclean requires up-to-date INDEX.db to work.

So if any newly added ports were built without cleaning out
work*/, portsclean wouldn't notice it, thus, won't delete it.
And this can harm any ports depending upon it in some situations.


Another thing to mention is that unpatched portsclean doesn't
know how to handle flavored ports, thus, work-* like appeared
in the second `rm` command in Daniel's suggestion are always
ignored.

Attached is what I have for ports-mgmt/portupgrade-devel.
(Not perfect for FLAVOR supports and not fully adapted with
 recent ports framework, though.)

Unfortunately, ports-mgmt/portupgrade{-devel} are unmaintained
(except for adapting upgraded default ruby) for too long time
and many proposed patches are NOT handled, thus, I've lost track
with from which PR (or suggestions on MLs or somewhere else)
I've obtained them. This is moslty because I needed to merge
multiple patches that applies to the same file.

And even on registered PRs, some are attached as patches,
but some are sugested in comments.

Anyway, portsclean is too handy and too useful to ignore,
thus, I'm continuously reporting non-ASCII characters
in MOVED to be removed or rewritten with ASCII only
to make portsdb happy. Unfortunately, I'm not enough familiar
with ruby to fix portsdb for allowing non-ASCII characters
in MOVED.

Regards.

-- 
Tomoaki AOKI    <[email protected]>
diff --git a/ports-mgmt/portupgrade-devel/files/extra-patch-bin_portsclean b/ports-mgmt/portupgrade-devel/files/extra-patch-bin_portsclean
new file mode 100644
index 000000000000..4dbad6842d4d
--- /dev/null
+++ b/ports-mgmt/portupgrade-devel/files/extra-patch-bin_portsclean
@@ -0,0 +1,18 @@
+--- bin/portsclean.orig	2018-03-09 19:59:29.000000000 +0100
++++ bin/portsclean	2018-08-12 19:06:56.356177000 +0200
+@@ -177,13 +177,13 @@
+   wrkdirprefix.gsub!(%r"/(?=/|$)", '')
+ 
+   if wrkdirprefix.empty?
+-    puts "Cleaning out #{$ports_dir}/*/*/work..."
++    puts "Cleaning out #{$ports_dir}/*/*/work*..."
+ 
+     # Ruby's glob yields the given block everytime a new matching
+     # entry is found, so it doesn't overflow, and we don't have to
+     # wait until everything is found.
+ 
+-    Dir.glob(File.join($ports_dir, "*/*/work")) do |dir|
++    Dir.glob(File.join($ports_dir, "*/*/work*")) do |dir|
+       delete_dir dir
+     end
+ 
diff --git a/ports-mgmt/portupgrade-devel/files/patch-bin_pkg__glob b/ports-mgmt/portupgrade-devel/files/patch-bin_pkg__glob
new file mode 100644
index 000000000000..adabd82330d6
--- /dev/null
+++ b/ports-mgmt/portupgrade-devel/files/patch-bin_pkg__glob
@@ -0,0 +1,11 @@
+--- bin/pkg_glob.orig	2018-10-10 16:03:41.664989000 +0900
++++ bin/pkg_glob	2018-10-10 16:23:44.589276000 +0900
+@@ -398,7 +398,7 @@ def deinstall_pkg(pkgname)
+ 
+ 	next if $noexecute
+ 
+-	if system('/bin/cp', '-Rpf', file, dest)
++	if system('/bin/cp', '-pf', file, dest)
+ 	  preserved_files << dest
+ 	else
+ 	  STDERR.puts "Copy failed!"
diff --git a/ports-mgmt/portupgrade-devel/files/patch-bin_portsclean b/ports-mgmt/portupgrade-devel/files/patch-bin_portsclean
new file mode 100644
index 000000000000..cd85135da55b
--- /dev/null
+++ b/ports-mgmt/portupgrade-devel/files/patch-bin_portsclean
@@ -0,0 +1,26 @@
+--- bin/portsclean.orig	2024-02-29 19:03:26 UTC
++++ bin/portsclean
+@@ -177,12 +177,12 @@
+   wrkdirprefix.gsub!(%r"/(?=/|$)", '')
+ 
+   if wrkdirprefix.empty?
+-    puts "Cleaning out #{$ports_dir}/*/*/work..."
++    puts "Cleaning out #{$ports_dir}/*/*/work*..."
+ 
+     # Ruby's glob yields the given block everytime a new matching
+     # entry is found, so it doesn't overflow, and we don't have to
+     # wait until everything is found.
+ 
+-    Dir.glob(File.join($ports_dir, "*/*/work")) do |dir|
++    Dir.glob(File.join($ports_dir, "*/*/work*")) do |dir|
+       delete_dir dir
+     end
+@@ -282,7 +282,7 @@ def ldconfig_m(*dirs)
+   msg = " --> Running ldconfig -m"
+ 
+   dirs.each do |d|
+-    dirs.delete(d) if ! (File.exists?(d) && File.stat(d).directory?)
++    dirs.delete(d) if ! (File.exist?(d) && File.stat(d).directory?)
+   end
+ 
+   case dirs.size
diff --git a/ports-mgmt/portupgrade-devel/files/patch-bin_portupgrade b/ports-mgmt/portupgrade-devel/files/patch-bin_portupgrade
new file mode 100644
index 000000000000..d2e31abfe199
--- /dev/null
+++ b/ports-mgmt/portupgrade-devel/files/patch-bin_portupgrade
@@ -0,0 +1,57 @@
+--- bin/portupgrade.orig	2018-04-24 15:55:20.997322000 +0200
++++ bin/portupgrade	2023-01-31 07:25:10.064426000 +0200
+@@ -199,6 +199,7 @@
+   $logfilename_format = nil
+   $make_args = ""
+   $make_env = []
++  $flavor = ""
+   $new = MYNAME == 'portinstall'
+   $noexecute = false
+   $noconfig = false
+@@ -1179,6 +1180,10 @@
+     make_env << 'env'
+   end
+ 
++  unless $flavor.empty?
++    make_env << 'FLAVOR=' + $flavor
++  end
++
+   unless is_new or $without_env_upgrade
+     make_env.concat(get_upgrade_env_vars($current_pkgname))
+   end
+@@ -1264,6 +1269,18 @@
+ 
+   oldpkgname = oldpkg.fullname
+   origin ||= oldpkg.origin
++# old flavor
++  $flavor = backquote!(PkgDB::command(:pkg), 'annotate', '-Sq', "#{oldpkgname}", 'flavor').chomp
++# new flavor
++  portdir = $portsdb.portdir(origin)
++  newflavor = `cd #{portdir} && make pretty-flavors-package-names | sed -ne 's!^\\([A-Za-z0-9_]*\\): *#{oldpkgname}$!\\1!p'`
++  newflavor.chomp!
++  if $flavor.empty? and !newflavor.empty?
++    $flavor = newflavor
++    progress_message "adding flavor #{oldpkgname} #{$flavor}" unless $flavor.empty?
++  else
++    progress_message "preserving flavor #{oldpkgname} #{$flavor}" unless $flavor.empty?
++  end
+ 
+   if origin && config_held?(origin)
+     if $force
+@@ -2195,12 +2195,12 @@
+ 
+   name = pkgname.sub(/-[^\-]+$/, '')
+ 
+-  glob_pkgfile = name + '-*.t[bgx]z'
+-  re_pkgfile = /^#{Regexp.quote(name)}-[^\-]+\.t[bgx]z$/
++  glob_pkgfile = name + '-*.pkg'
++  re_pkgfile = /^#{Regexp.quote(name)}-[^\-]+\.pkg$/
+ 
+   if latest_link = $portsdb.latest_link(origin)
+-    glob_pkgfile = "{#{glob_pkgfile},#{latest_link}.t[bgx]z}"
+-    re_pkgfile = /(?:#{re_pkgfile.source}|^#{Regexp.quote(latest_link)}\.t[bgx]z$)/
++    glob_pkgfile = "{#{glob_pkgfile},#{latest_link}.pkg}"
++    re_pkgfile = /(?:#{re_pkgfile.source}|^#{Regexp.quote(latest_link)}\.pkg$)/
+   end
+ 
+   pkglist = []
diff --git a/ports-mgmt/portupgrade-devel/files/patch-lib_pkgtools_pkgtools.rb b/ports-mgmt/portupgrade-devel/files/patch-lib_pkgtools_pkgtools.rb
new file mode 100644
index 000000000000..d1cf333def64
--- /dev/null
+++ b/ports-mgmt/portupgrade-devel/files/patch-lib_pkgtools_pkgtools.rb
@@ -0,0 +1,65 @@
+--- lib/pkgtools/pkgtools.rb.orig	2024-02-29 19:03:26 UTC
++++ lib/pkgtools/pkgtools.rb
+@@ -315,7 +315,7 @@ end
+ def yesno_str(yes)
+   if yes then 'yes' else 'no' end
+ end
+-  
++
+ def prompt_yesno(message = "OK?", yes_by_default = false)
+   if $automatic
+     input = yesno_str(yes_by_default)
+@@ -524,7 +524,7 @@ def script_path
+   # If a fixed/custom script(1) is installed by the port, use that version.
+   # See #8
+   custom_script = "#{PREFIX}/libexec/pkgtools/script"
+-  if File.exists?(custom_script)
++  if File.exist?(custom_script)
+     $script_path = custom_script
+   else
+     $script_path = '/usr/bin/script'
+@@ -533,7 +533,7 @@ def logged_command(file, args)
+ end
+ 
+ def logged_command(file, args)
+-  if !file  
++  if !file
+     args
+   else
+     [script_path(), '-qa', file, *args]
+@@ -780,7 +780,7 @@ def modify_pkgdep(pkgname, dep, newdep, neworigin = ni
+       if newdep == :add
+ 	keyword = $1
+ 	data = $2
+-	if keyword == "pkgdep " && 
++	if keyword == "pkgdep " &&
+ 	  		data.sub(pkgver_re,'') == dep.sub(pkgver_re,'')
+ 	  depends_lines << "@pkgdep #{dep}\n"
+ 	  pkgdep_undeleted = true
+@@ -981,7 +981,7 @@ class PkgResult
+   def done?
+     @result == :done
+   end
+-  
++
+   def ignored?
+     @result == :ignored
+   end
+@@ -1068,7 +1068,7 @@ class PkgResult
+ 
+     io.puts line
+   end
+-  
++
+   def self.legend(long = false)
+     if long
+       [:done, :ignored, :skipped, :error]
+@@ -1102,7 +1102,7 @@ class PkgResultSet < SimpleDelegator
+ 
+   def summary
+     count = Hash.new(0)
+-    
++
+     each do |result|
+       if result.done?
+         count[:done] += 1

Reply via email to