squared 0.4.23 → 0.4.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +27 -0
 - data/README.md +1 -1
 - data/lib/squared/common/format.rb +5 -3
 - data/lib/squared/common/shell.rb +18 -18
 - data/lib/squared/version.rb +1 -1
 - data/lib/squared/workspace/application.rb +4 -16
 - data/lib/squared/workspace/project/base.rb +33 -48
 - data/lib/squared/workspace/project/docker.rb +4 -4
 - data/lib/squared/workspace/project/git.rb +2 -2
 - data/lib/squared/workspace/project/node.rb +3 -3
 - data/lib/squared/workspace/project/ruby.rb +1 -1
 - data/lib/squared/workspace/project/support/class.rb +6 -5
 - data/lib/squared/workspace/repo.rb +4 -3
 - data/lib/squared/workspace/support/base.rb +20 -0
 - metadata +6 -3
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 11a03c7d13bf0170f8b60953148792df626cf1c1edb02f7a1da9c46a4668fc1d
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: ee42ffc6ac7b056604d9bb8ad81041dcd7787cb6d883b253f5390e7e94addc99
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 23cf6af69c98270efe9894f77e646c6006e34652aae843cc621fd6248324efece67b90bd60ea107f28c7a38b522885984f8f0e5e962dc5dd67c6d52ae522ac05
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 3cd04987351a9a9f98c878ab93307270ea7fa84d93207d361455ec008dc757ad98b258b2c098280ae1ae22aee78b90b179df9b654d9f01594b2c1198d02f4b0b
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,5 +1,30 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # Changelog
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            ## [0.4.25] - 2025-10-18
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            ### Fixed
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            - Project groups did not have their own copy of base events.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            ## [0.4.24] - 2025-10-17
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            ### Added
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            - Repo task [init|all] can bypass dev? copy requirement with REPO_STAGE=4.
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            ### Changed
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            - Node command outdated does not check PNPM minimum version.
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            ### Fixed
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            - Project base rescue error handling used reversed parameters.
         
     | 
| 
      
 22 
     | 
    
         
            +
            - Project absolute paths did not append wildcard with trailing slash.
         
     | 
| 
      
 23 
     | 
    
         
            +
            - Powershell commands did not escape nested double quotes.
         
     | 
| 
      
 24 
     | 
    
         
            +
            - OptionPartition did not strip flags without a value.
         
     | 
| 
      
 25 
     | 
    
         
            +
            - Project base method add did not use parent context.
         
     | 
| 
      
 26 
     | 
    
         
            +
            - Application property pipe did not parse numeric values.
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
       3 
28 
     | 
    
         
             
            ## [0.4.23] - 2025-10-11
         
     | 
| 
       4 
29 
     | 
    
         | 
| 
       5 
30 
     | 
    
         
             
            ### Fixed
         
     | 
| 
         @@ -1018,6 +1043,8 @@ 
     | 
|
| 
       1018 
1043 
     | 
    
         | 
| 
       1019 
1044 
     | 
    
         
             
            - Changelog was created.
         
     | 
| 
       1020 
1045 
     | 
    
         | 
| 
      
 1046 
     | 
    
         
            +
            [0.4.25]: https://github.com/anpham6/squared-ruby/releases/tag/v0.4.25
         
     | 
| 
      
 1047 
     | 
    
         
            +
            [0.4.24]: https://github.com/anpham6/squared-ruby/releases/tag/v0.4.24
         
     | 
| 
       1021 
1048 
     | 
    
         
             
            [0.4.23]: https://github.com/anpham6/squared-ruby/releases/tag/v0.4.23
         
     | 
| 
       1022 
1049 
     | 
    
         
             
            [0.4.22]: https://github.com/anpham6/squared-ruby/releases/tag/v0.4.22
         
     | 
| 
       1023 
1050 
     | 
    
         
             
            [0.4.21]: https://github.com/anpham6/squared-ruby/releases/tag/v0.4.21
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -723,7 +723,7 @@ REPO_SYNC            # 0,1 
     | 
|
| 
       723 
723 
     | 
    
         
             
            REPO_URL             # manifest repository
         
     | 
| 
       724 
724 
     | 
    
         
             
            REPO_MANIFEST        # e.g. latest,nightly,prod
         
     | 
| 
       725 
725 
     | 
    
         
             
            REPO_GROUPS          # e.g. base,prod,docs
         
     | 
| 
       726 
     | 
    
         
            -
            REPO_STAGE           # 0,1,2,3
         
     | 
| 
      
 726 
     | 
    
         
            +
            REPO_STAGE           # 0,1,2,3,4
         
     | 
| 
       727 
727 
     | 
    
         
             
            REPO_SUBMODULLES     # 0,1
         
     | 
| 
       728 
728 
     | 
    
         
             
            REPO_TIMEOUT         # confirm dialog (seconds)
         
     | 
| 
       729 
729 
     | 
    
         
             
            ```
         
     | 
| 
         @@ -178,8 +178,9 @@ module Squared 
     | 
|
| 
       178 
178 
     | 
    
         
             
                    args = args.map(&:to_s)
         
     | 
| 
       179 
179 
     | 
    
         
             
                    if level.is_a?(::Numeric)
         
     | 
| 
       180 
180 
     | 
    
         
             
                      if append && respond_to?(:log)
         
     | 
| 
       181 
     | 
    
         
            -
                         
     | 
| 
       182 
     | 
    
         
            -
             
     | 
| 
      
 181 
     | 
    
         
            +
                        (log rescue nil).tap do |ref|
         
     | 
| 
      
 182 
     | 
    
         
            +
                          ref.add(level, message(subject, *args, hint: hint, space: ', ')) if ref.is_a?(Logger)
         
     | 
| 
      
 183 
     | 
    
         
            +
                        end
         
     | 
| 
       183 
184 
     | 
    
         
             
                      end
         
     | 
| 
       184 
185 
     | 
    
         
             
                      return false if !pass && level < ARG[:LEVEL]
         
     | 
| 
       185 
186 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -217,7 +218,8 @@ module Squared 
     | 
|
| 
       217 
218 
     | 
    
         
             
                  module_function
         
     | 
| 
       218 
219 
     | 
    
         | 
| 
       219 
220 
     | 
    
         
             
                  def message(*args, hint: nil, empty: false, space: ARG[:SPACE])
         
     | 
| 
       220 
     | 
    
         
            -
                    (empty ? args.reject { |val| val.nil? || val.empty?  
     | 
| 
      
 221 
     | 
    
         
            +
                    (empty ? args.reject { |val| val.nil? || (val.respond_to?(:empty?) && val.empty?) } : args)
         
     | 
| 
      
 222 
     | 
    
         
            +
                      .join(space) + (hint ? " (#{hint})" : '')
         
     | 
| 
       221 
223 
     | 
    
         
             
                  end
         
     | 
| 
       222 
224 
     | 
    
         | 
| 
       223 
225 
     | 
    
         
             
                  def emphasize(val, title: nil, footer: nil, right: false, cols: nil, sub: nil, pipe: nil,
         
     | 
    
        data/lib/squared/common/shell.rb
    CHANGED
    
    | 
         @@ -16,15 +16,15 @@ module Squared 
     | 
|
| 
       16 
16 
     | 
    
         
             
                      elsif !r[3] || r[6]
         
     | 
| 
       17 
17 
     | 
    
         
             
                        return val
         
     | 
| 
       18 
18 
     | 
    
         
             
                      end
         
     | 
| 
       19 
     | 
    
         
            -
                      if r[7].match?(/\A["']/)
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
      
 19 
     | 
    
         
            +
                      opt = if r[7].match?(/\A["']/)
         
     | 
| 
      
 20 
     | 
    
         
            +
                              "#{r[7]}#{r[7][0]}"
         
     | 
| 
      
 21 
     | 
    
         
            +
                            elsif r[7].match?(/["']\z/)
         
     | 
| 
      
 22 
     | 
    
         
            +
                              "#{r[7][-1]}#{r[7]}"
         
     | 
| 
      
 23 
     | 
    
         
            +
                            else
         
     | 
| 
      
 24 
     | 
    
         
            +
                              return val unless r[7].match?(/\s/)
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                              r[7]
         
     | 
| 
      
 27 
     | 
    
         
            +
                            end
         
     | 
| 
       28 
28 
     | 
    
         
             
                      r[1] + (data ? data[2] : r[2]) + r[4] + shell_quote(opt, double: double, force: force, override: override)
         
     | 
| 
       29 
29 
     | 
    
         
             
                    elsif option && val =~ /\A([^=]+)=(.+)\z/m
         
     | 
| 
       30 
30 
     | 
    
         
             
                      return val if $2.match?(/\A(["']).+\1\z/m)
         
     | 
| 
         @@ -65,15 +65,15 @@ module Squared 
     | 
|
| 
       65 
65 
     | 
    
         
             
                      escape = false
         
     | 
| 
       66 
66 
     | 
    
         
             
                      override = true
         
     | 
| 
       67 
67 
     | 
    
         
             
                    end
         
     | 
| 
       68 
     | 
    
         
            -
                    if flag[0] == '-'
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
             
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
      
 68 
     | 
    
         
            +
                    b = if flag[0] == '-'
         
     | 
| 
      
 69 
     | 
    
         
            +
                          flag[1] == '-' ? '=' : ' '
         
     | 
| 
      
 70 
     | 
    
         
            +
                        elsif flag.size == 1
         
     | 
| 
      
 71 
     | 
    
         
            +
                          a = '-'
         
     | 
| 
      
 72 
     | 
    
         
            +
                          merge ? '' : ' '
         
     | 
| 
      
 73 
     | 
    
         
            +
                        else
         
     | 
| 
      
 74 
     | 
    
         
            +
                          a = '--'
         
     | 
| 
      
 75 
     | 
    
         
            +
                          '='
         
     | 
| 
      
 76 
     | 
    
         
            +
                        end
         
     | 
| 
       77 
77 
     | 
    
         
             
                    "#{a}#{flag}#{unless val.nil?
         
     | 
| 
       78 
78 
     | 
    
         
             
                                    "#{b}#{if escape
         
     | 
| 
       79 
79 
     | 
    
         
             
                                             shell_escape(val, quote: quote, double: double, override: override)
         
     | 
    
        data/lib/squared/version.rb
    CHANGED
    
    
| 
         @@ -140,7 +140,7 @@ module Squared 
     | 
|
| 
       140 
140 
     | 
    
         
             
                    return unless @pipe.is_a?(Pathname)
         
     | 
| 
       141 
141 
     | 
    
         | 
| 
       142 
142 
     | 
    
         
             
                    msg = "Session started on #{Time.now} by #{@main}"
         
     | 
| 
       143 
     | 
    
         
            -
                    bord = '#' *  
     | 
| 
      
 143 
     | 
    
         
            +
                    bord = '#' * msg.size
         
     | 
| 
       144 
144 
     | 
    
         
             
                    puts bord, msg, bord
         
     | 
| 
       145 
145 
     | 
    
         
             
                  end
         
     | 
| 
       146 
146 
     | 
    
         | 
| 
         @@ -322,21 +322,9 @@ module Squared 
     | 
|
| 
       322 
322 
     | 
    
         
             
                  end
         
     | 
| 
       323 
323 
     | 
    
         | 
| 
       324 
324 
     | 
    
         
             
                  def add(path, project = nil, **kwargs, &blk)
         
     | 
| 
       325 
     | 
    
         
            -
                    if @withargs
         
     | 
| 
       326 
     | 
    
         
            -
             
     | 
| 
       327 
     | 
    
         
            -
             
     | 
| 
       328 
     | 
    
         
            -
                      kwargs = data
         
     | 
| 
       329 
     | 
    
         
            -
                    end
         
     | 
| 
       330 
     | 
    
         
            -
                    ref = if kwargs.key?(:ref)
         
     | 
| 
       331 
     | 
    
         
            -
                            kwargs = kwargs.dup unless @withargs
         
     | 
| 
       332 
     | 
    
         
            -
                            kwargs.delete(:ref)
         
     | 
| 
       333 
     | 
    
         
            -
                          elsif @ref.is_a?(Symbol)
         
     | 
| 
       334 
     | 
    
         
            -
                            @ref
         
     | 
| 
       335 
     | 
    
         
            -
                          end
         
     | 
| 
       336 
     | 
    
         
            -
                    if @group.is_a?(String) && !kwargs.key?(:group)
         
     | 
| 
       337 
     | 
    
         
            -
                      kwargs = kwargs.dup unless @withargs
         
     | 
| 
       338 
     | 
    
         
            -
                      kwargs[:group] = @group
         
     | 
| 
       339 
     | 
    
         
            -
                    end
         
     | 
| 
      
 325 
     | 
    
         
            +
                    kwargs = Support.hashdup(@withargs).update(kwargs) if @withargs
         
     | 
| 
      
 326 
     | 
    
         
            +
                    ref = kwargs.key?(:ref) ? kwargs.delete(:ref) : @ref
         
     | 
| 
      
 327 
     | 
    
         
            +
                    kwargs[:group] = @group if @group && !kwargs.key?(:group)
         
     | 
| 
       340 
328 
     | 
    
         
             
                    path = root + path
         
     | 
| 
       341 
329 
     | 
    
         
             
                    project = (project || path.basename).to_s
         
     | 
| 
       342 
330 
     | 
    
         
             
                    name = task_name project
         
     | 
| 
         @@ -396,20 +396,12 @@ module Squared 
     | 
|
| 
       396 
396 
     | 
    
         
             
                        return self
         
     | 
| 
       397 
397 
     | 
    
         
             
                      elsif !projectpath?(path = basepath(path)) || !checkdir?(path)
         
     | 
| 
       398 
398 
     | 
    
         
             
                        return self
         
     | 
| 
       399 
     | 
    
         
            -
                      else
         
     | 
| 
       400 
     | 
    
         
            -
                        name = case name
         
     | 
| 
       401 
     | 
    
         
            -
                               when String, Symbol
         
     | 
| 
       402 
     | 
    
         
            -
                                 name.to_s
         
     | 
| 
       403 
     | 
    
         
            -
                               end
         
     | 
| 
       404 
399 
     | 
    
         
             
                      end
         
     | 
| 
       405 
     | 
    
         
            -
                      if @withargs
         
     | 
| 
       406 
     | 
    
         
            -
             
     | 
| 
       407 
     | 
    
         
            -
                        data.merge!(kwargs)
         
     | 
| 
       408 
     | 
    
         
            -
                        kwargs = data
         
     | 
| 
       409 
     | 
    
         
            -
                      end
         
     | 
| 
       410 
     | 
    
         
            -
                      kwargs[:group] = group unless kwargs.key?(:group)
         
     | 
| 
      
 400 
     | 
    
         
            +
                      kwargs = hashdup(@withargs).update(kwargs) if @withargs
         
     | 
| 
      
 401 
     | 
    
         
            +
                      kwargs[:group] = group if group && !kwargs.key?(:group)
         
     | 
| 
       411 
402 
     | 
    
         
             
                      kwargs[:ref] = ref unless kwargs.key?(:ref)
         
     | 
| 
       412 
403 
     | 
    
         
             
                      parent = self
         
     | 
| 
      
 404 
     | 
    
         
            +
                      proj = nil
         
     | 
| 
       413 
405 
     | 
    
         
             
                      name = case name
         
     | 
| 
       414 
406 
     | 
    
         
             
                             when String, Symbol
         
     | 
| 
       415 
407 
     | 
    
         
             
                               name.to_s
         
     | 
| 
         @@ -418,9 +410,10 @@ module Squared 
     | 
|
| 
       418 
410 
     | 
    
         
             
                             end
         
     | 
| 
       419 
411 
     | 
    
         
             
                      workspace.add(path, name, **kwargs) do
         
     | 
| 
       420 
412 
     | 
    
         
             
                        __send__ :parent_set, parent
         
     | 
| 
       421 
     | 
    
         
            -
                         
     | 
| 
      
 413 
     | 
    
         
            +
                        proj = self
         
     | 
| 
       422 
414 
     | 
    
         
             
                        instance_eval(&blk) if block_given?
         
     | 
| 
       423 
415 
     | 
    
         
             
                      end
         
     | 
| 
      
 416 
     | 
    
         
            +
                      @children << proj
         
     | 
| 
       424 
417 
     | 
    
         
             
                      self
         
     | 
| 
       425 
418 
     | 
    
         
             
                    end
         
     | 
| 
       426 
419 
     | 
    
         | 
| 
         @@ -482,11 +475,9 @@ module Squared 
     | 
|
| 
       482 
475 
     | 
    
         
             
                      else
         
     | 
| 
       483 
476 
     | 
    
         
             
                        cmd, opts, var, flags, extra = args
         
     | 
| 
       484 
477 
     | 
    
         
             
                      end
         
     | 
| 
       485 
     | 
    
         
            -
                      if cmd.is_a?(Proc) || cmd.is_a?(Method)
         
     | 
| 
       486 
     | 
    
         
            -
                        run_b(cmd, sync: sync, from: from)
         
     | 
| 
       487 
     | 
    
         
            -
                        return
         
     | 
| 
       488 
     | 
    
         
            -
                      end
         
     | 
| 
       489 
478 
     | 
    
         
             
                      if cmd
         
     | 
| 
      
 479 
     | 
    
         
            +
                        return run_b(cmd, sync: sync, from: from) if cmd.is_a?(Proc) || cmd.is_a?(Method)
         
     | 
| 
      
 480 
     | 
    
         
            +
             
     | 
| 
       490 
481 
     | 
    
         
             
                        cmd = as_get(cmd, from)
         
     | 
| 
       491 
482 
     | 
    
         
             
                        opts = compose(opts, script: false) if opts && respond_to?(:compose)
         
     | 
| 
       492 
483 
     | 
    
         
             
                        flags = append_hash(flags, target: []).join(' ') if flags.is_a?(Hash)
         
     | 
| 
         @@ -528,7 +519,7 @@ module Squared 
     | 
|
| 
       528 
519 
     | 
    
         
             
                                proj.__send__(meth, sync: sync)
         
     | 
| 
       529 
520 
     | 
    
         
             
                                next
         
     | 
| 
       530 
521 
     | 
    
         
             
                              rescue StandardError => e
         
     | 
| 
       531 
     | 
    
         
            -
                                on_error(:prereqs,  
     | 
| 
      
 522 
     | 
    
         
            +
                                on_error(e, :prereqs, exception: true)
         
     | 
| 
       532 
523 
     | 
    
         
             
                              end
         
     | 
| 
       533 
524 
     | 
    
         
             
                            end
         
     | 
| 
       534 
525 
     | 
    
         
             
                            print_error(name, 'method not found', subject: 'prereqs', hint: meth)
         
     | 
| 
         @@ -548,7 +539,7 @@ module Squared 
     | 
|
| 
       548 
539 
     | 
    
         
             
                    end
         
     | 
| 
       549 
540 
     | 
    
         | 
| 
       550 
541 
     | 
    
         
             
                    def doc(*, sync: invoked_sync?('doc'), **)
         
     | 
| 
       551 
     | 
    
         
            -
                      run_b(@doc, sync: sync,  
     | 
| 
      
 542 
     | 
    
         
            +
                      run_b(@doc, sync: sync, banner: verbosetype > (from_base?('doc') ? 1 : 0), from: :doc)
         
     | 
| 
       552 
543 
     | 
    
         
             
                    end
         
     | 
| 
       553 
544 
     | 
    
         | 
| 
       554 
545 
     | 
    
         
             
                    def lint(*, sync: invoked_sync?('lint'), **)
         
     | 
| 
         @@ -569,9 +560,9 @@ module Squared 
     | 
|
| 
       569 
560 
     | 
    
         
             
                      on :first, :clean unless pass
         
     | 
| 
       570 
561 
     | 
    
         
             
                      case @clean
         
     | 
| 
       571 
562 
     | 
    
         
             
                      when Struct
         
     | 
| 
       572 
     | 
    
         
            -
                        if ( 
     | 
| 
      
 563 
     | 
    
         
            +
                        if (val = instance_eval(&@clean.block) || @clean.run)
         
     | 
| 
       573 
564 
     | 
    
         
             
                          temp = @clean
         
     | 
| 
       574 
     | 
    
         
            -
                          @clean =  
     | 
| 
      
 565 
     | 
    
         
            +
                          @clean = val
         
     | 
| 
       575 
566 
     | 
    
         
             
                          clean(*args, sync: sync, pass: true, **kwargs)
         
     | 
| 
       576 
567 
     | 
    
         
             
                          @clean = temp
         
     | 
| 
       577 
568 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -589,7 +580,7 @@ module Squared 
     | 
|
| 
       589 
580 
     | 
    
         
             
                            entry = basepath(val = val.to_s)
         
     | 
| 
       590 
581 
     | 
    
         
             
                            if entry.directory? && val.match?(%r{[\\/]\z})
         
     | 
| 
       591 
582 
     | 
    
         
             
                              log&.warn "rm -rf #{entry}"
         
     | 
| 
       592 
     | 
    
         
            -
                              rm_rf(entry, verbose:  
     | 
| 
      
 583 
     | 
    
         
            +
                              rm_rf(entry, verbose: verbosetype > 0)
         
     | 
| 
       593 
584 
     | 
    
         
             
                            else
         
     | 
| 
       594 
585 
     | 
    
         
             
                              log&.warn "rm #{entry}"
         
     | 
| 
       595 
586 
     | 
    
         
             
                              (val.include?('*') ? Dir[entry] : [entry]).each do |file|
         
     | 
| 
         @@ -630,7 +621,7 @@ module Squared 
     | 
|
| 
       630 
621 
     | 
    
         
             
                      end
         
     | 
| 
       631 
622 
     | 
    
         
             
                      ret = graph_branch(self, data, tasks, out, sync: sync, pass: pass)
         
     | 
| 
       632 
623 
     | 
    
         
             
                    rescue StandardError => e
         
     | 
| 
       633 
     | 
    
         
            -
                      on_error(:graph,  
     | 
| 
      
 624 
     | 
    
         
            +
                      on_error(e, :graph, exception: true)
         
     | 
| 
       634 
625 
     | 
    
         
             
                    else
         
     | 
| 
       635 
626 
     | 
    
         
             
                      if out
         
     | 
| 
       636 
627 
     | 
    
         
             
                        [out, ret]
         
     | 
| 
         @@ -688,7 +679,7 @@ module Squared 
     | 
|
| 
       688 
679 
     | 
    
         
             
                            case f.content_type
         
     | 
| 
       689 
680 
     | 
    
         
             
                            when 'application/zip'
         
     | 
| 
       690 
681 
     | 
    
         
             
                              ext = 'zip'
         
     | 
| 
       691 
     | 
    
         
            -
                            when  
     | 
| 
      
 682 
     | 
    
         
            +
                            when %r{application/(?:x-)?gzip}
         
     | 
| 
       692 
683 
     | 
    
         
             
                              ext = 'tgz'
         
     | 
| 
       693 
684 
     | 
    
         
             
                            when 'application/x-xz'
         
     | 
| 
       694 
685 
     | 
    
         
             
                              ext = 'txz'
         
     | 
| 
         @@ -750,9 +741,7 @@ module Squared 
     | 
|
| 
       750 
741 
     | 
    
         
             
                          break unless entry.directory?
         
     | 
| 
       751 
742 
     | 
    
         | 
| 
       752 
743 
     | 
    
         
             
                          i = 0
         
     | 
| 
       753 
     | 
    
         
            -
                          while (dest = target + "#{File.basename(file)}-#{i}").exist?
         
     | 
| 
       754 
     | 
    
         
            -
                            i += 1
         
     | 
| 
       755 
     | 
    
         
            -
                          end
         
     | 
| 
      
 744 
     | 
    
         
            +
                          i += 1 while (dest = target + "#{File.basename(file)}-#{i}").exist?
         
     | 
| 
       756 
745 
     | 
    
         
             
                          FileUtils.mv(entry, dest)
         
     | 
| 
       757 
746 
     | 
    
         
             
                          dest.children.each { |child| FileUtils.mv(child, target) }
         
     | 
| 
       758 
747 
     | 
    
         
             
                          dest.rmdir
         
     | 
| 
         @@ -852,7 +841,7 @@ module Squared 
     | 
|
| 
       852 
841 
     | 
    
         
             
                          ret = shell(*args, chdir: chdir, exception: exception)
         
     | 
| 
       853 
842 
     | 
    
         
             
                        end
         
     | 
| 
       854 
843 
     | 
    
         
             
                      rescue StandardError => e
         
     | 
| 
       855 
     | 
    
         
            -
                        on_error( 
     | 
| 
      
 844 
     | 
    
         
            +
                        on_error(e, from, exception: true)
         
     | 
| 
       856 
845 
     | 
    
         
             
                        false
         
     | 
| 
       857 
846 
     | 
    
         
             
                      else
         
     | 
| 
       858 
847 
     | 
    
         
             
                        on :last, from
         
     | 
| 
         @@ -1641,8 +1630,8 @@ module Squared 
     | 
|
| 
       1641 
1630 
     | 
    
         
             
                      confirm "Upgrade to #{a}? #{b + e} [#{c}] ", d
         
     | 
| 
       1642 
1631 
     | 
    
         
             
                    end
         
     | 
| 
       1643 
1632 
     | 
    
         | 
| 
       1644 
     | 
    
         
            -
                    def choice_index(msg, list, values: nil, accept: nil, series: false, trim: nil, column: nil,
         
     | 
| 
       1645 
     | 
    
         
            -
                                      
     | 
| 
      
 1633 
     | 
    
         
            +
                    def choice_index(msg, list, values: nil, accept: nil, series: false, trim: nil, column: nil, multiple: false,
         
     | 
| 
      
 1634 
     | 
    
         
            +
                                     force: true, **kwargs)
         
     | 
| 
       1646 
1635 
     | 
    
         
             
                      puts if !series && !printfirst?
         
     | 
| 
       1647 
1636 
     | 
    
         
             
                      msg = "#{msg} (optional)" unless force
         
     | 
| 
       1648 
1637 
     | 
    
         
             
                      unless (ret = choice(msg, list, multiple: multiple, force: force, **kwargs)) && !ret.empty?
         
     | 
| 
         @@ -1658,14 +1647,11 @@ module Squared 
     | 
|
| 
       1658 
1647 
     | 
    
         
             
                      if accept
         
     | 
| 
       1659 
1648 
     | 
    
         
             
                        hint = Array(ret).map { |val| sub_style(val, styles: theme[:inline]) }.join(', ')
         
     | 
| 
       1660 
1649 
     | 
    
         
             
                        accept = Array(accept).map { |val| Array(val) }
         
     | 
| 
       1661 
     | 
    
         
            -
                        if accept.any? { |val| val[1] == true }
         
     | 
| 
       1662 
     | 
    
         
            -
                          ret = [ret]
         
     | 
| 
       1663 
     | 
    
         
            -
                          multiple = -1
         
     | 
| 
       1664 
     | 
    
         
            -
                        end
         
     | 
| 
      
 1650 
     | 
    
         
            +
                        ret = Array(ret) if accept.any? { |val| val[1] == true }
         
     | 
| 
       1665 
1651 
     | 
    
         
             
                        loop do
         
     | 
| 
       1666 
1652 
     | 
    
         
             
                          item = accept.first
         
     | 
| 
       1667 
1653 
     | 
    
         
             
                          d, e = item[2] ? ['Y', '[Y/n]'] : ['N', '[y/N]']
         
     | 
| 
       1668 
     | 
    
         
            -
                          c = confirm("#{item[0]}#{ 
     | 
| 
      
 1654 
     | 
    
         
            +
                          c = confirm("#{item[0]}#{hint ? " [#{hint}]" : ''} #{e} ", d, timeout: 60)
         
     | 
| 
       1669 
1655 
     | 
    
         
             
                          if item[1] == true
         
     | 
| 
       1670 
1656 
     | 
    
         
             
                            ret << c
         
     | 
| 
       1671 
1657 
     | 
    
         
             
                          elsif !c
         
     | 
| 
         @@ -1678,7 +1664,7 @@ module Squared 
     | 
|
| 
       1678 
1664 
     | 
    
         
             
                        exit 1 unless accept.empty?
         
     | 
| 
       1679 
1665 
     | 
    
         
             
                      end
         
     | 
| 
       1680 
1666 
     | 
    
         
             
                      if values
         
     | 
| 
       1681 
     | 
    
         
            -
                        ret =  
     | 
| 
      
 1667 
     | 
    
         
            +
                        ret = Array(ret)
         
     | 
| 
       1682 
1668 
     | 
    
         
             
                        values.each do |val|
         
     | 
| 
       1683 
1669 
     | 
    
         
             
                          if val.is_a?(Array)
         
     | 
| 
       1684 
1670 
     | 
    
         
             
                            val, force = val
         
     | 
| 
         @@ -1712,21 +1698,17 @@ module Squared 
     | 
|
| 
       1712 
1698 
     | 
    
         
             
                    end
         
     | 
| 
       1713 
1699 
     | 
    
         | 
| 
       1714 
1700 
     | 
    
         
             
                    def command(*args)
         
     | 
| 
       1715 
     | 
    
         
            -
                       
     | 
| 
       1716 
     | 
    
         
            -
             
     | 
| 
       1717 
     | 
    
         
            -
                       
     | 
| 
       1718 
     | 
    
         
            -
                        args.join(' && ')
         
     | 
| 
       1719 
     | 
    
         
            -
                      end
         
     | 
| 
      
 1701 
     | 
    
         
            +
                      return args.join(' && ') unless workspace.powershell?
         
     | 
| 
      
 1702 
     | 
    
         
            +
             
     | 
| 
      
 1703 
     | 
    
         
            +
                      "powershell.exe -Command #{shell_quote("& {#{args.join(' ; ')}}", option: false, double: true)}"
         
     | 
| 
       1720 
1704 
     | 
    
         
             
                    end
         
     | 
| 
       1721 
1705 
     | 
    
         | 
| 
       1722 
1706 
     | 
    
         
             
                    def relativepath(*list, all: false)
         
     | 
| 
       1723 
1707 
     | 
    
         
             
                      return [] if list.empty?
         
     | 
| 
       1724 
1708 
     | 
    
         | 
| 
       1725 
1709 
     | 
    
         
             
                      list.flatten.map! { |val| Pathname.new(val) }.select { |val| projectpath?(val) }.map! do |val|
         
     | 
| 
       1726 
     | 
    
         
            -
                         
     | 
| 
       1727 
     | 
    
         
            -
                         
     | 
| 
       1728 
     | 
    
         
            -
                        val = "#{val}*" if all && val.end_with?('/')
         
     | 
| 
       1729 
     | 
    
         
            -
                        val
         
     | 
| 
      
 1710 
     | 
    
         
            +
                        ret = (val.absolute? ? val.relative_path_from(path) : val.cleanpath).to_s
         
     | 
| 
      
 1711 
     | 
    
         
            +
                        all && val.to_s.end_with?('/') ? "#{ret}/*" : ret
         
     | 
| 
       1730 
1712 
     | 
    
         
             
                      end
         
     | 
| 
       1731 
1713 
     | 
    
         
             
                    end
         
     | 
| 
       1732 
1714 
     | 
    
         | 
| 
         @@ -1811,8 +1793,7 @@ module Squared 
     | 
|
| 
       1811 
1793 
     | 
    
         
             
                    end
         
     | 
| 
       1812 
1794 
     | 
    
         | 
| 
       1813 
1795 
     | 
    
         
             
                    def color(val)
         
     | 
| 
       1814 
     | 
    
         
            -
                      ret = theme[val]
         
     | 
| 
       1815 
     | 
    
         
            -
                      ret && !ret.empty? ? ret : [val]
         
     | 
| 
      
 1796 
     | 
    
         
            +
                      (ret = theme[val]) && !ret.empty? ? ret : [val]
         
     | 
| 
       1816 
1797 
     | 
    
         
             
                    end
         
     | 
| 
       1817 
1798 
     | 
    
         | 
| 
       1818 
1799 
     | 
    
         
             
                    def colormap(val)
         
     | 
| 
         @@ -2041,8 +2022,8 @@ module Squared 
     | 
|
| 
       2041 
2022 
     | 
    
         
             
                    end
         
     | 
| 
       2042 
2023 
     | 
    
         | 
| 
       2043 
2024 
     | 
    
         
             
                    def projectpath?(val)
         
     | 
| 
       2044 
     | 
    
         
            -
                       
     | 
| 
       2045 
     | 
    
         
            -
                       
     | 
| 
      
 2025 
     | 
    
         
            +
                      ret = Pathname.new(val).cleanpath
         
     | 
| 
      
 2026 
     | 
    
         
            +
                      ret.absolute? ? ret.to_s.start_with?(File.join(path, '')) : !ret.to_s.start_with?(File.join('..', ''))
         
     | 
| 
       2046 
2027 
     | 
    
         
             
                    end
         
     | 
| 
       2047 
2028 
     | 
    
         | 
| 
       2048 
2029 
     | 
    
         
             
                    def checkdir?(val)
         
     | 
| 
         @@ -2149,6 +2130,10 @@ module Squared 
     | 
|
| 
       2149 
2130 
     | 
    
         
             
                      Workspace::Support.hashlist
         
     | 
| 
       2150 
2131 
     | 
    
         
             
                    end
         
     | 
| 
       2151 
2132 
     | 
    
         | 
| 
      
 2133 
     | 
    
         
            +
                    def hashdup
         
     | 
| 
      
 2134 
     | 
    
         
            +
                      Workspace::Support.hashdup
         
     | 
| 
      
 2135 
     | 
    
         
            +
                    end
         
     | 
| 
      
 2136 
     | 
    
         
            +
             
     | 
| 
       2152 
2137 
     | 
    
         
             
                    def borderstyle
         
     | 
| 
       2153 
2138 
     | 
    
         
             
                      ((data = workspace.banner_get(*@ref, group: group)) && data[:border]) || theme[:border]
         
     | 
| 
       2154 
2139 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -113,7 +113,7 @@ module Squared 
     | 
|
| 
       113 
113 
     | 
    
         
             
                      return unless dockerfile(file).exist?
         
     | 
| 
       114 
114 
     | 
    
         | 
| 
       115 
115 
     | 
    
         
             
                      @context = context
         
     | 
| 
       116 
     | 
    
         
            -
                       
     | 
| 
      
 116 
     | 
    
         
            +
                      self.tag = tag || tagname("#{@project}:#{@version || 'latest'}")
         
     | 
| 
       117 
117 
     | 
    
         
             
                      @mounts = mounts
         
     | 
| 
       118 
118 
     | 
    
         
             
                      @secrets = secrets
         
     | 
| 
       119 
119 
     | 
    
         
             
                      @registry = tagjoin registry, kwargs[:username]
         
     | 
| 
         @@ -206,7 +206,7 @@ module Squared 
     | 
|
| 
       206 
206 
     | 
    
         
             
                                    end
         
     | 
| 
       207 
207 
     | 
    
         
             
                                  end
         
     | 
| 
       208 
208 
     | 
    
         
             
                                else
         
     | 
| 
       209 
     | 
    
         
            -
                                  format_desc 
     | 
| 
      
 209 
     | 
    
         
            +
                                  format_desc action, flag, "opts*,id/name#{flag == :update ? '+' : '*'}"
         
     | 
| 
       210 
210 
     | 
    
         
             
                                  task flag do |_, args|
         
     | 
| 
       211 
211 
     | 
    
         
             
                                    container flag, args.to_a
         
     | 
| 
       212 
212 
     | 
    
         
             
                                  end
         
     | 
| 
         @@ -522,7 +522,7 @@ module Squared 
     | 
|
| 
       522 
522 
     | 
    
         
             
                        list_image(flag, docker_output('image ls -a'), from: from) do |val|
         
     | 
| 
       523 
523 
     | 
    
         
             
                          op << val
         
     | 
| 
       524 
524 
     | 
    
         
             
                          if flag == :tag
         
     | 
| 
       525 
     | 
    
         
            -
                            op << tagname("#{ 
     | 
| 
      
 525 
     | 
    
         
            +
                            op << tagname("#{project}:#{op.first}")
         
     | 
| 
       526 
526 
     | 
    
         
             
                            break
         
     | 
| 
       527 
527 
     | 
    
         
             
                          end
         
     | 
| 
       528 
528 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -653,7 +653,7 @@ module Squared 
     | 
|
| 
       653 
653 
     | 
    
         
             
                      ver = option('version', target: target, ignore: false)
         
     | 
| 
       654 
654 
     | 
    
         
             
                      list = case val
         
     | 
| 
       655 
655 
     | 
    
         
             
                             when String
         
     | 
| 
       656 
     | 
    
         
            -
                               val 
     | 
| 
      
 656 
     | 
    
         
            +
                               split_escape val
         
     | 
| 
       657 
657 
     | 
    
         
             
                             when Array
         
     | 
| 
       658 
658 
     | 
    
         
             
                               val
         
     | 
| 
       659 
659 
     | 
    
         
             
                             else
         
     | 
| 
         @@ -637,7 +637,7 @@ module Squared 
     | 
|
| 
       637 
637 
     | 
    
         
             
                                  task flag, [:commit] do |_, args|
         
     | 
| 
       638 
638 
     | 
    
         
             
                                    commit = commithead args.commit
         
     | 
| 
       639 
639 
     | 
    
         
             
                                    unless commit
         
     | 
| 
       640 
     | 
    
         
            -
                                      commit, merge = choice_commit(values: ['Merge? [y 
     | 
| 
      
 640 
     | 
    
         
            +
                                      commit, merge = choice_commit(values: ['Merge? [y/N]'])
         
     | 
| 
       641 
641 
     | 
    
         
             
                                      merge = merge&.upcase == 'Y'
         
     | 
| 
       642 
642 
     | 
    
         
             
                                    end
         
     | 
| 
       643 
643 
     | 
    
         
             
                                    checkout(flag, commit: commit, merge: merge)
         
     | 
| 
         @@ -721,7 +721,7 @@ module Squared 
     | 
|
| 
       721 
721 
     | 
    
         
             
                                  task flag, [:name, :commit] do |_, args|
         
     | 
| 
       722 
722 
     | 
    
         
             
                                    branch = param_guard(action, flag, args: args, key: :name)
         
     | 
| 
       723 
723 
     | 
    
         
             
                                    commit = commithead args.commit
         
     | 
| 
       724 
     | 
    
         
            -
                                    commit, track = choice_commit(values: ['Track? [Y 
     | 
| 
      
 724 
     | 
    
         
            +
                                    commit, track = choice_commit(values: ['Track? [Y/n]'], force: false) if commit == ':'
         
     | 
| 
       725 
725 
     | 
    
         
             
                                    switch(flag, branch: branch, commit: commit, track: track)
         
     | 
| 
       726 
726 
     | 
    
         
             
                                  end
         
     | 
| 
       727 
727 
     | 
    
         
             
                                when :detach
         
     | 
| 
         @@ -366,7 +366,7 @@ module Squared 
     | 
|
| 
       366 
366 
     | 
    
         
             
                                subdir << target.to_s
         
     | 
| 
       367 
367 
     | 
    
         
             
                              end
         
     | 
| 
       368 
368 
     | 
    
         
             
                              begin
         
     | 
| 
       369 
     | 
    
         
            -
                                FileUtils.cp(basepath(s), dest, verbose:  
     | 
| 
      
 369 
     | 
    
         
            +
                                FileUtils.cp(basepath(s), dest, verbose: verbosetype > 0)
         
     | 
| 
       370 
370 
     | 
    
         
             
                              rescue StandardError => e
         
     | 
| 
       371 
371 
     | 
    
         
             
                                print_error e
         
     | 
| 
       372 
372 
     | 
    
         
             
                                errors += 1
         
     | 
| 
         @@ -410,7 +410,7 @@ module Squared 
     | 
|
| 
       410 
410 
     | 
    
         
             
                        target.each do |src, to|
         
     | 
| 
       411 
411 
     | 
    
         
             
                          glob.each { |val| log.info "cp #{from + val} #{to}" }
         
     | 
| 
       412 
412 
     | 
    
         
             
                          begin
         
     | 
| 
       413 
     | 
    
         
            -
                            copy_dir(src, to, glob, create: create, link: link, force: force, pass: pass, verbose:  
     | 
| 
      
 413 
     | 
    
         
            +
                            copy_dir(src, to, glob, create: create, link: link, force: force, pass: pass, verbose: verbosetype > 0)
         
     | 
| 
       414 
414 
     | 
    
         
             
                          rescue StandardError => e
         
     | 
| 
       415 
415 
     | 
    
         
             
                            on_error e, :copy
         
     | 
| 
       416 
416 
     | 
    
         
             
                          end
         
     | 
| 
         @@ -482,7 +482,7 @@ module Squared 
     | 
|
| 
       482 
482 
     | 
    
         | 
| 
       483 
483 
     | 
    
         
             
                    def outdated(flag = nil, opts = [], sync: invoked_sync?('outdated', flag))
         
     | 
| 
       484 
484 
     | 
    
         
             
                      dryrun = opts.include?('dry-run') || opts.include?('d')
         
     | 
| 
       485 
     | 
    
         
            -
                      if pnpm? 
     | 
| 
      
 485 
     | 
    
         
            +
                      if pnpm?
         
     | 
| 
       486 
486 
     | 
    
         
             
                        cmd = session 'pnpm', 'outdated'
         
     | 
| 
       487 
487 
     | 
    
         
             
                        dryrun ||= dryrun?('pnpm')
         
     | 
| 
       488 
488 
     | 
    
         
             
                      else
         
     | 
| 
         @@ -312,7 +312,7 @@ module Squared 
     | 
|
| 
       312 
312 
     | 
    
         
             
                        c = glob[i] || glob.first
         
     | 
| 
       313 
313 
     | 
    
         
             
                        log.info "cp #{a + c} #{b}"
         
     | 
| 
       314 
314 
     | 
    
         
             
                        begin
         
     | 
| 
       315 
     | 
    
         
            -
                          copy_dir(a, b, c, pass: pass, verbose:  
     | 
| 
      
 315 
     | 
    
         
            +
                          copy_dir(a, b, c, pass: pass, verbose: verbosetype > 0)
         
     | 
| 
       316 
316 
     | 
    
         
             
                        rescue StandardError => e
         
     | 
| 
       317 
317 
     | 
    
         
             
                          on_error e, :copy
         
     | 
| 
       318 
318 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -10,9 +10,10 @@ module Squared 
     | 
|
| 
       10 
10 
     | 
    
         
             
                      include Common::Shell
         
     | 
| 
       11 
11 
     | 
    
         
             
                      extend Forwardable
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
      
 13 
     | 
    
         
            +
                      OPT_NAME = /\A(?:(--)|-)((?(1)[A-Za-z\d]+|[A-Za-z\d]))\z/
         
     | 
| 
       13 
14 
     | 
    
         
             
                      OPT_VALUE = /\A-{0,2}([^= ]+)(?: *= *| +)(.+)\z/
         
     | 
| 
       14 
15 
     | 
    
         
             
                      OPT_SINGLE = /\A-([A-Za-z\d])(.+)\z/
         
     | 
| 
       15 
     | 
    
         
            -
                      private_constant :OPT_VALUE, :OPT_SINGLE
         
     | 
| 
      
 16 
     | 
    
         
            +
                      private_constant :OPT_NAME, :OPT_VALUE, :OPT_SINGLE
         
     | 
| 
       16 
17 
     | 
    
         | 
| 
       17 
18 
     | 
    
         
             
                      class << self
         
     | 
| 
       18 
19 
     | 
    
         
             
                        include Common::Format
         
     | 
| 
         @@ -70,8 +71,8 @@ module Squared 
     | 
|
| 
       70 
71 
     | 
    
         
             
                        def strip(val)
         
     | 
| 
       71 
72 
     | 
    
         
             
                          return [] unless val
         
     | 
| 
       72 
73 
     | 
    
         | 
| 
       73 
     | 
    
         
            -
                          val = shell_split 
     | 
| 
       74 
     | 
    
         
            -
                          val.map { |s| s.sub(OPT_SINGLE, '\1=\2').sub(OPT_VALUE, '\1=\2') }.reject(&:empty?)
         
     | 
| 
      
 74 
     | 
    
         
            +
                          val = shell_split val if val.is_a?(String)
         
     | 
| 
      
 75 
     | 
    
         
            +
                          val.map { |s| s.sub(OPT_SINGLE, '\1=\2').sub(OPT_VALUE, '\1=\2').sub(OPT_NAME, '\2') }.reject(&:empty?)
         
     | 
| 
       75 
76 
     | 
    
         
             
                        end
         
     | 
| 
       76 
77 
     | 
    
         | 
| 
       77 
78 
     | 
    
         
             
                        def select(list, bare: true, no: true, single: false, double: false)
         
     | 
| 
         @@ -246,9 +247,9 @@ module Squared 
     | 
|
| 
       246 
247 
     | 
    
         
             
                                add quote_option(key, val, double: qq.include?(key), merge: merge)
         
     | 
| 
       247 
248 
     | 
    
         
             
                              elsif p.include?(key)
         
     | 
| 
       248 
249 
     | 
    
         
             
                                if val.match?(/\A(["']).+\1\z/)
         
     | 
| 
       249 
     | 
    
         
            -
                                  add shell_option(key, val, escape: false, merge: merge 
     | 
| 
      
 250 
     | 
    
         
            +
                                  add shell_option(key, val, escape: false, merge: merge)
         
     | 
| 
       250 
251 
     | 
    
         
             
                                elsif path
         
     | 
| 
       251 
     | 
    
         
            -
                                  add quote_option(key, path + val, merge: merge 
     | 
| 
      
 252 
     | 
    
         
            +
                                  add quote_option(key, path + val, merge: merge)
         
     | 
| 
       252 
253 
     | 
    
         
             
                                else
         
     | 
| 
       253 
254 
     | 
    
         
             
                                  push opt
         
     | 
| 
       254 
255 
     | 
    
         
             
                                end
         
     | 
| 
         @@ -132,19 +132,20 @@ module Squared 
     | 
|
| 
       132 
132 
     | 
    
         
             
                      task 'all' do |_, args|
         
     | 
| 
       133 
133 
     | 
    
         
             
                        stage ||= 'all'
         
     | 
| 
       134 
134 
     | 
    
         
             
                        ns['sync'].invoke(*args.to_a)
         
     | 
| 
       135 
     | 
    
         
            -
                        next if env('REPO_STAGE' 
     | 
| 
      
 135 
     | 
    
         
            +
                        next if (stage = env('REPO_STAGE')) == '1'
         
     | 
| 
       136 
136 
     | 
    
         | 
| 
       137 
137 
     | 
    
         
             
                        @project.select do |_, proj|
         
     | 
| 
       138 
138 
     | 
    
         
             
                          next unless proj.enabled?(proj.workspace.baseref)
         
     | 
| 
       139 
139 
     | 
    
         | 
| 
       140 
140 
     | 
    
         
             
                          proj.depend(sync: true) if proj.depend?
         
     | 
| 
       141 
     | 
    
         
            -
                          next if  
     | 
| 
      
 141 
     | 
    
         
            +
                          next if stage == '2'
         
     | 
| 
       142 
142 
     | 
    
         | 
| 
       143 
143 
     | 
    
         
             
                          proj.build?
         
     | 
| 
       144 
144 
     | 
    
         
             
                        end
         
     | 
| 
       145 
145 
     | 
    
         
             
                        .each_value do |proj|
         
     | 
| 
       146 
146 
     | 
    
         
             
                          proj.build(sync: true)
         
     | 
| 
       147 
     | 
    
         
            -
                          next  
     | 
| 
      
 147 
     | 
    
         
            +
                          next if stage == '3'
         
     | 
| 
      
 148 
     | 
    
         
            +
                          next unless proj.copy? && (proj.dev? || stage == '4')
         
     | 
| 
       148 
149 
     | 
    
         | 
| 
       149 
150 
     | 
    
         
             
                          if (ws = proj.workspace).task_defined?(target = task_join(proj.name, 'copy'))
         
     | 
| 
       150 
151 
     | 
    
         
             
                            task_invoke(target, **ws.invokeargs)
         
     | 
| 
         @@ -11,6 +11,26 @@ module Squared 
     | 
|
| 
       11 
11 
     | 
    
         
             
                    def hashlist
         
     | 
| 
       12 
12 
     | 
    
         
             
                      Hash.new { |data, key| data[key] = [] }
         
     | 
| 
       13 
13 
     | 
    
         
             
                    end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                    def hashdup(data, pass: [])
         
     | 
| 
      
 16 
     | 
    
         
            +
                      ret = {}
         
     | 
| 
      
 17 
     | 
    
         
            +
                      data.each do |key, val|
         
     | 
| 
      
 18 
     | 
    
         
            +
                        ret[key] = case val
         
     | 
| 
      
 19 
     | 
    
         
            +
                                   when Hash
         
     | 
| 
      
 20 
     | 
    
         
            +
                                     if pass.include?(val)
         
     | 
| 
      
 21 
     | 
    
         
            +
                                       val
         
     | 
| 
      
 22 
     | 
    
         
            +
                                     else
         
     | 
| 
      
 23 
     | 
    
         
            +
                                       pass << val
         
     | 
| 
      
 24 
     | 
    
         
            +
                                       hashdup(val, pass: pass)
         
     | 
| 
      
 25 
     | 
    
         
            +
                                     end
         
     | 
| 
      
 26 
     | 
    
         
            +
                                   when Proc, Method
         
     | 
| 
      
 27 
     | 
    
         
            +
                                     val
         
     | 
| 
      
 28 
     | 
    
         
            +
                                   else
         
     | 
| 
      
 29 
     | 
    
         
            +
                                     val.dup
         
     | 
| 
      
 30 
     | 
    
         
            +
                                   end
         
     | 
| 
      
 31 
     | 
    
         
            +
                      end
         
     | 
| 
      
 32 
     | 
    
         
            +
                      ret
         
     | 
| 
      
 33 
     | 
    
         
            +
                    end
         
     | 
| 
       14 
34 
     | 
    
         
             
                  end
         
     | 
| 
       15 
35 
     | 
    
         
             
                end
         
     | 
| 
       16 
36 
     | 
    
         
             
              end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,13 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: squared
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.4. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.4.25
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - An Pham
         
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire:
         
     | 
| 
       8 
9 
     | 
    
         
             
            bindir: exe
         
     | 
| 
       9 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       10 
     | 
    
         
            -
            date:  
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2025-10-18 00:00:00.000000000 Z
         
     | 
| 
       11 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       12 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       13 
14 
     | 
    
         
             
              name: rake
         
     | 
| 
         @@ -111,6 +112,7 @@ metadata: 
     | 
|
| 
       111 
112 
     | 
    
         
             
              homepage_uri: https://github.com/anpham6/squared-ruby
         
     | 
| 
       112 
113 
     | 
    
         
             
              source_code_uri: https://github.com/anpham6/squared-ruby
         
     | 
| 
       113 
114 
     | 
    
         
             
              documentation_uri: https://squared.readthedocs.io
         
     | 
| 
      
 115 
     | 
    
         
            +
            post_install_message:
         
     | 
| 
       114 
116 
     | 
    
         
             
            rdoc_options: []
         
     | 
| 
       115 
117 
     | 
    
         
             
            require_paths:
         
     | 
| 
       116 
118 
     | 
    
         
             
            - lib
         
     | 
| 
         @@ -125,7 +127,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       125 
127 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       126 
128 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       127 
129 
     | 
    
         
             
            requirements: []
         
     | 
| 
       128 
     | 
    
         
            -
            rubygems_version: 3. 
     | 
| 
      
 130 
     | 
    
         
            +
            rubygems_version: 3.2.33
         
     | 
| 
      
 131 
     | 
    
         
            +
            signing_key:
         
     | 
| 
       129 
132 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       130 
133 
     | 
    
         
             
            summary: Rake task generator for managing multi-language workspaces.
         
     | 
| 
       131 
134 
     | 
    
         
             
            test_files: []
         
     |