Name

diffmerge —

ATTRIBUTES

Attribute Pos. Req. Default Description
flags
safe_data
ascii
result
interpolate     0 interpolate input?
reparse     1 interpolate output?
hide     0 Hide the tag return value?

DESCRIPTION

BEHAVIOR

This tag does not appear to be affected by, or affect, the rest of Interchange.

EXAMPLES

No examples are available at this time. We do consider this a problem and will try to supply some.

NOTES

AVAILABILITY

diffmerge is available in Interchange versions:

4.6.0-5.9.0 (git-head)

SOURCE

Interchange 5.9.0:

Source: code/UI_Tag/diffmerge.coretag
Lines: 130


# Copyright 2002-2007 Interchange Development Group and others
# 
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.  See the LICENSE file for details.
# 
# $Id: diffmerge.coretag,v 1.4 2007-03-30 23:40:54 pajamian Exp $

# This tag uses GNU diff3 to merge two texts blocks that were
# modified from the same ancestral text together, and marks
# conflicts that may appear. This is similar to CVS's merging
# and conflict marking. The names the diff3 manpage uses are:
#
#        older
#         / \
#        /   \
#       /     \
#    mine    yours
#
# You supply pointers to three text blocks, either as file names or
# database fields in the form Table::Column::Key. 'mine' can instead
# be provided in the body, between the opening and closing tags.
#
# The tag returns the merged text. You can find out whether a
# conflict was detected by providing the name of a scratch variable
# in the 'result' option where the return code from diff3 will be placed.
#
# Set the 'ascii' option to allow for different newline types and
# ignore whether the last line of the file has a newline.
#
# Set the 'safe_data' option to allow raw data to be pulled from the
# database without escaping left brackets (turning [ into [).
#
# Examples:
#
# [diffmerge /tmp/abcd2 /tmp/abcd1 /tmp/abcd3]
#
# [diffmerge
#     yours="content::pagebody::00001"
#     older="backup::pagebody::00001"
#     ascii=1
#     result=diff_result
#     safe_data=1
# ][scratch new_pagebody][/diffmerge]

UserTag diffmerge Interpolate   1
UserTag diffmerge hasEndTag
UserTag diffmerge addAttr
UserTag diffmerge Version       $Revision: 1.4 $

# These designations come from the diff3 manpage.
# It seemed easier to use their names than to make up new ones.
UserTag diffmerge Order yours older mine

# But here I try to make up new ones anyway. :)
UserTag diffmerge attrAlias     <<EOA
current    mine
curr    mine
previous  yours
prev    yours
old      older
EOA

UserTag diffmerge Routine       <<EOR
sub {
  my ($yours, $older, $mine, $opt, $body) = @_;

  unless ($opt->{flags} =~ /^[-\s\w.]*$/) {
      Log("diffmerge tag: Security violation with flags: $opt->{flags}");
      return "Security violation with flags: $opt->{flags}. Logged.";
  }

my ($minefn, $yoursfn, $olderfn, $cmd, $merge);
my $tmpbasename = "tmp/$Vend::SessionName";

my $data_opt = {};
$data_opt->{safe_data} = 1 if $opt->{safe_data};

my $asciifix = sub {
  local $_ = shift;
  if ($opt->{ascii}) {
    s/\r\n?/\n/g;
    $_ .= "\n" unless substr($_, -1, 1) eq "\n";
  }
  return $_;
};

my $putfile = sub {
  my ($name, $passed, $fn) = @_;
    if ($$passed =~ /^(\w+)::(.*?)::(.*)/) {
        my ($table, $col, $key) = ($1, $2, $3);
    my $data = $asciifix->( tag_data($table, $col, $key, $data_opt) );
        $$fn = "$tmpbasename.$name";
        Vend::Util::writefile(">$$fn", $data);
    }
    else {
        $$fn = $$passed;
    }
};

if ($body) {
  $body = $asciifix->($body);
  $minefn = "tmp/$Vend::SessionName.mine";
  Vend::Util::writefile(">$minefn", $body);
}
elsif ($mine) {
  $putfile->('mine', \$mine, \$minefn);
}

$putfile->('yours', \$yours, \$yoursfn);
$putfile->('older', \$older, \$olderfn);

  $cmd = "diff3 -m $opt->{flags} $minefn $olderfn $yoursfn";
#Debug("diffmerge command: '$cmd'");
  $merge = `$cmd`;

if (defined $opt->{result}) {
  unless ($opt->{result} =~ /\W/) {
    $Scratch->{$opt->{result}} = $? >> 8;
#Debug("diffmerge put $Scratch->{$opt->{result}} into scratch $opt->{result}");
  }
  else {
    Log("diffmerge tag: Invalid 'result' option given; must be a valid \
 name for a scratch variable");
  }
}

return $merge;
}
EOR

AUTHORS

Interchange Development Group

SEE ALSO

DocBook! Interchange!