Source

histedit / tests / test-histedit-no-change

Full commit
#!/bin/sh

# test for issue #6:
# editing a changeset without any actual change would corrupt the repository

. "$TESTDIR/histedit-helpers.sh"

cat >> $HGRCPATH <<EOF
[extensions]
hgext.graphlog=
hg_histedit=$(echo $(dirname $(dirname $0)))/hg_histedit.py
EOF

initrepo ()
{
    dir="$1"
    comment="$2"

    if [ -n "${comment}" ]; then
        echo % ${comment}
        echo % ${comment} | sed 's:.:-:g'
    fi

    hg init ${dir}
    cd ${dir}
    for x in a b c d e f ; do
        echo $x > $x
        hg add $x
        hg ci -m $x
    done
}

geneditor ()
{
    # generate an editor script for selecting changesets to be edited

    choice=$1  # changesets that should be edited (using sed line ranges)

    cat <<EOF | sed 's:^....::'
    #!/bin/sh

    # editing the rules, replacing 'pick' with 'edit' for the chosen lines
    sed '${choice}s:^pick:edit:' \$1 > \${1}.tmp
    mv \${1}.tmp \$1

    # displaying the resulting rules, minus comments and empty lines
    sed '/^#/d;/^$/d;s:^:| :' \$1 >&2
EOF
}

startediting ()
{
    # begin an editing session

    choice="$1"  # changesets that should be edited
    number="$2"  # number of changesets considered (from tip)
    comment="$3"

    geneditor "${choice}" > edit.sh
    chmod +x edit.sh

    echo % start editing the history ${comment}
    HGEDITOR=./edit.sh hg histedit -- -${number} 2>&1 | fixbundle
}

continueediting ()
{
    # continue an edit already in progress

    editor="$1"  # message editor when finalizing editing
    comment="$2"

    echo % finalize changeset editing ${comment}
    HGEDITOR=${editor} hg histedit --continue 2>&1 | fixbundle
}

graphlog ()
{
    comment="${1:-log}"

    echo % "${comment}"
    hg glog --template '{rev} {node} \"{desc|firstline}\"\n'
}



initrepo r1 "test editing with no change"
graphlog "log before editing"
startediting 2 3 "(not changing anything)" # edit the 2nd of 3 changesets
continueediting true "(leaving commit message unaltered)"

echo "% check state of working copy"
hg id

graphlog "log after history editing"


cd ..
initrepo r2 "test editing with no change, then abort"
graphlog "log before editing"
startediting 1,2 3 "(not changing anything)" # edit the 1st two of 3 changesets
continueediting true "(leaving commit message unaltered)"
graphlog "log after first edit"

echo % abort editing session
hg histedit --abort 2>&1 | fixbundle

graphlog "log after abort"

echo % EOF