Class: AdLint::Cc1::ValueVersionController

Inherits:
Object
  • Object
show all
Defined in:
lib/adlint/cc1/value.rb

Instance Method Summary collapse

Constructor Details

#initialize(orig_val) ⇒ ValueVersionController

Returns a new instance of ValueVersionController.



2631
2632
2633
# File 'lib/adlint/cc1/value.rb', line 2631

def initialize(orig_val)
  @versioning_group_stack = [RootVersioningGroup.new(orig_val)]
end

Instance Method Details

#begin_forkingObject



2652
2653
2654
# File 'lib/adlint/cc1/value.rb', line 2652

def begin_forking
  current_versioning_group.begin_new_version
end

#copy_current_versionObject



2698
2699
2700
2701
2702
2703
2704
# File 'lib/adlint/cc1/value.rb', line 2698

def copy_current_version
  # NOTE: This method must be called between ending of the forking section
  #       and ending of the versioning group.
  if current_versioning_group.sticky?
    current_values.each { |mval| mval.fork }
  end
end

#current_valuesObject



2639
2640
2641
# File 'lib/adlint/cc1/value.rb', line 2639

def current_values
  current_versioning_group.current_values
end

#end_forkingObject



2656
2657
2658
# File 'lib/adlint/cc1/value.rb', line 2656

def end_forking
  current_versioning_group.end_current_version
end

#enter_new_versioning_groupObject



2643
2644
2645
2646
# File 'lib/adlint/cc1/value.rb', line 2643

def enter_new_versioning_group
  new_group = VersioningGroup.new(current_versioning_group.current_version)
  @versioning_group_stack.push(new_group)
end

#fork_current_versionObject



2660
2661
2662
# File 'lib/adlint/cc1/value.rb', line 2660

def fork_current_version
  fork_all_versions
end

#leave_current_versioning_groupObject



2648
2649
2650
# File 'lib/adlint/cc1/value.rb', line 2648

def leave_current_versioning_group
  @versioning_group_stack.pop
end

#mark_current_versioning_group_as_stickyObject



2688
2689
2690
2691
2692
2693
2694
2695
2696
# File 'lib/adlint/cc1/value.rb', line 2688

def mark_current_versioning_group_as_sticky
  @versioning_group_stack.reverse_each do |group|
    if group.sticky?
      break
    else
      group.sticky = true
    end
  end
end

#merge_forked_versionsObject



2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
# File 'lib/adlint/cc1/value.rb', line 2706

def merge_forked_versions
  # NOTE: This method must be called between ending of the forking section
  #       and ending of the versioning group.
  base_ver = current_versioning_group.base_version

  case
  when current_versioning_group.sticky?
    fork_all_versions
    base_vals = base_ver.values.map { |mval| mval.descendants }.flatten
    base_ver.values = base_vals.each_with_object({}) { |mval, hash|
      if eql_mval = hash[mval]
        eql_mval._base.tag.by = mval._base.tag.by + eql_mval._base.tag.by
        eql_mval._base.tag.at = mval._base.tag.at + eql_mval._base.tag.at
      else
        hash[mval] = mval
      end
    }.keys
  when current_versioning_group.versions_forked?
    # NOTE: When versions in the current versioning group have been forked,
    #       base_version of the current versioning group has already been
    #       forked.  So, it is safe to overwrite the base_version's values
    #       with the current versioning group's initial snapshot values.
    init_vals = current_versioning_group.initial_values
    vals = base_ver.values.zip(init_vals)
    vals.each do |base_mval, init_sval|
      base_mval.delete_descendants!
      if base_mval.kind_of?(VersionedValue)
        base_mval._orig_overwrite!(init_sval, TransitionTag.new)
      else
        base_mval.overwrite!(init_sval, TransitionTag.new)
      end
    end
  else
    # NOTE: Nothing to be done when base_version of the current versioning
    #       group has not been forked.
  end
end

#original_valueObject



2635
2636
2637
# File 'lib/adlint/cc1/value.rb', line 2635

def original_value
  root_versioning_group.initial_values.first
end

#thin_current_version(with_rollback) ⇒ Object



2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
# File 'lib/adlint/cc1/value.rb', line 2664

def thin_current_version(with_rollback)
  # NOTE: This method must be called in the forking section.

  forked = current_version.forked?

  if with_rollback
    initial_vals = current_version.initial_values
    current_versioning_group.delete_current_version_completely
    base_vals = current_versioning_group.base_values
    base_vals.zip(initial_vals).each do |mval, init_val|
      mval.rollback! if forked
      mval.overwrite!(init_val, TransitionTag.new) if init_val
    end
    begin_forking
  else
    current_versioning_group.delete_current_version
    if forked
      current_versioning_group.base_values.each { |mval| mval.rollback! }
    end
  end

  mark_current_versioning_group_as_sticky
end