quilt-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Quilt-dev] CVS / source control support


From: Joe Green
Subject: [Quilt-dev] CVS / source control support
Date: Wed, 24 Aug 2005 18:46:31 -0700
User-agent: Mozilla Thunderbird 1.0.2 (X11/20050317)

Hi,

Josh Boyer asked me to post the CVS support patches I have a few weeks ago.  It took me a while to get rev'ed up to 0.42 (sorry Josh!), but here they are.

This is implemented as a set of "generic" stubs in the quilt code that are overriden with versions which support CVS from a user's quiltrc file.  I say "generic" because I'm sure in practice additional hooks might be needed for some other source control systems (e.g. to do some operation before adding a file, rather than after).

This implementation does source control operations for changes to the patches in the QUILT_PATCHES directory or to the series file, not for files in the working tree.  It dynamically determines if the affected file is in a CVS controlled directory, and does nothing if it is not.

We place the patches and the series file in the QUILT_PATCHES directory, which is symlinked from the working tree to a CVS controlled directory.  The implementation doesn't assume this structure--it just looks to see if the files are in a CVS directory--but this is the only structure I've tested with.

The patches--in the order I apply them--are:
quilt-really_delete.patch
This is the same patch I posted earlier to add options to delete to remove the deleted patch files.  The scm_hooks patch is dependent on this patch because it adds a hook to the delete code.
quilt-realpath.patch
This patch adds patchfns "readlink" and "realpath" for dealing with symbolic links.  The CVS hooks depend on this, but I've also found these useful for other things, so I keep them in a separate patch.
quilt-scm_hooks.patch
This patch implements the generic source control hooks in the quilt code.  The default hooks just return success, so they don't do anything if not overridden by the user.
Finally, there is quiltrc.cvs:
This is not a patch, but shows the functions that can be added to a user's quiltrc file to override the default hooks and add support for CVS.

-- 
Joe Green <address@hidden>
MontaVista Software, Inc.
Source: MontaVista Software, Inc. <address@hidden>
Type: Enhancement
Disposition: submitted to http://savannah.nongnu.org/projects/quilt

Add options to the delete command that will remove the deleted patch from
the QUILT_PATCHES directory and optionally create a backup file.

Index: quilt-0.42/quilt/delete.in
===================================================================
--- quilt-0.42.orig/quilt/delete.in
+++ quilt-0.42/quilt/delete.in
@@ -19,7 +19,7 @@ fi
 
 usage()
 {
-       printf $"Usage: quilt delete [patch | -n]\n"
+       printf $"Usage: quilt delete [-r] [--backup] [patch | -n]\n"
        if [ x$1 = x-h ]
        then
                printf $"
@@ -29,6 +29,12 @@ topmost patch can be removed right now.)
 
 -n     Delete the next patch after topmost, rather than the specified
        or topmost patch.
+
+-r     Remove the deleted patch file from the patches directory as well.
+
+--backup
+       Rename the patch file to patch~ rather than deleting it.
+       Ignored if not used with \"-r\".
 "
 
                exit 0
@@ -37,7 +43,7 @@ topmost patch can be removed right now.)
        fi
 }
 
-options=`getopt -o nh -- "$@"`
+options=`getopt -o nrh --long backup -- "$@"`
 
 if [ $? -ne 0 ]
 then
@@ -52,8 +58,14 @@ do
        -n)
                opt_next=1
                shift ;;
+       -r)
+               opt_remove=1
+               shift ;;
        -h)
                usage -h ;;
+       --backup)
+               QUILT_BACKUP=1
+               shift ;;
        --)
                shift
                break ;;
@@ -113,6 +125,28 @@ then
        printf $"Removed patch %s\n" "$(print_patch "$patch")"
 else
        printf $"Failed to remove patch %s\n" "$(print_patch "$patch")" >&2
+       exit 1
+fi
+
+patch_file=$(patch_file_name "$patch")
+if [ "$opt_remove" -a -e "$patch_file" ]
+then
+       if [ "$QUILT_BACKUP" ]
+       then
+               if ! mv -f "$patch_file" "$patch_file~"
+               then
+                       printf $"Failed to backup patch file \"%s\"\n" \
+                               "$patch_file" >&2
+                       exit 1
+               fi
+       else
+               if ! rm -f "$patch_file"
+               then
+                       printf $"Failed to remove patch file \"%s\"\n" \
+                               "$patch_file" >&2
+                       exit 1
+               fi
+       fi
 fi
 ### Local Variables:
 ### mode: shell-script
Index: quilt-0.42/bash_completion
===================================================================
--- quilt-0.42.orig/bash_completion
+++ quilt-0.42/bash_completion
@@ -139,7 +139,7 @@ _quilt_completion()
           COMPREPLY=( $( compgen -W "-h $(quilt applied)" -- $cur ) )
           ;;
        delete) 
-          COMPREPLY=( $( compgen -W "-n -h $(quilt series)" -- $cur ) )
+          COMPREPLY=( $( compgen -W "-n -r -h --backup $(quilt series)" -- 
$cur ) )
           ;;
        diff) 
           case $prev in
Source: MontaVista Software, Inc. <address@hidden>
Type: Enhancement
Disposition: submit to http://savannah.nongnu.org/projects/quilt

Add "readlink" and "realpath" functions for following symlinks.

Index: quilt-0.42/scripts/patchfns.in
===================================================================
--- quilt-0.42.orig/scripts/patchfns.in
+++ quilt-0.42/scripts/patchfns.in
@@ -125,6 +125,29 @@ dirname()
        echo "${path:-.}"
 }
 
+if ! type readlink &> /dev/null ; then
+readlink()
+{
+       expr "$(/bin/ls -ld $1)" : ".*-> \(.*\)$"
+}
+fi
+
+# If input file names a symbolic link, print path to real file.
+# If non-existent or not a link, print the input path.
+realpath()
+{
+       local path="$1"
+       while [ -L "$path" ] ; do
+               local link=$(readlink "$path")
+               if [ "${link#/}" = "$link" ] ; then
+                       path=$(dirname "$path")"/$link"
+               else
+                       path="$link"
+               fi
+       done
+       echo "$path"
+}
+
 patch_file_name()
 {
        echo "$QUILT_PATCHES/$1"
Source: MontaVista Software, Inc. (address@hidden)
Type: Enhancement
Disposition: submit to http://savannah.nongnu.org/projects/quilt

Add hooks for Sofware Configuration Management systems.  These have
been tested with CVS hooks.

Index: quilt-0.42/quilt/import.in
===================================================================
--- quilt-0.42.orig/quilt/import.in
+++ quilt-0.42/quilt/import.in
@@ -104,10 +104,13 @@ do
                fi
                printf $"Replacing patch %s with new version\n" \
                       "$(print_patch $patch)" >&2
+               scm_modify_patch "edit" "$QUILT_PATCHES/$patch" || exit 1
+               newpatch=no
        else
                printf $"Importing patch %s (stored as %s)\n" \
                       "$(print_patch $patch_file)" \
                       "$(print_patch $patch)"
+               newpatch=yes
        fi
        dest=$QUILT_PATCHES/$patch
        mkdir -p "${dest%/*}"
@@ -117,6 +120,11 @@ do
                status=1
        fi
 
+       if [ "$newpatch" = "yes" ]
+       then
+               scm_modify_patch "add" "$QUILT_PATCHES/$patch" || exit 1
+       fi
+
        if ! patch_in_series $patch &&
           ! insert_in_series $patch "$patch_args"
        then
Index: quilt-0.42/scripts/patchfns.in
===================================================================
--- quilt-0.42.orig/scripts/patchfns.in
+++ quilt-0.42/scripts/patchfns.in
@@ -40,6 +40,35 @@ fi
 
 # ========================================================
 
+if [ "$(type -t scm_modify_patch)" != function ]
+then
+       # Overridable hook to enable source control for patch files.
+       scm_modify_patch()
+       {
+               # local op="$1" patch_file="$2"
+               # op is one of:
+               #   "add"       add patch_file to source control
+               #   "edit"      enable modification to existing patch_file
+               #   "delete"    remove patch_file from source control
+               return 0
+       }
+fi
+
+if [ "$(type -t scm_modify_series)" != function ]
+then
+       # Overridable hook to enable source control for series file.
+       scm_modify_series()
+       {
+               # local op="$1" series_file="$2"
+               # op is one of:
+               #   "add"       add series_file to source control
+               #   "edit"      enable modification to existing series_file
+               return 0
+       }
+fi
+
+# ========================================================
+
 #declare -a exit_handlers
 #
 #add_exit_handler() {
@@ -167,6 +196,11 @@ change_db_strip_level()
                ' $SERIES > $tmpfile
                if ! cmp $SERIES $tmpfile >/dev/null 2>/dev/null
                then
+                       if ! scm_modify_series "edit" "$SERIES"
+                       then
+                               rm -f $tmpfile
+                               return 1
+                       fi
                        cat $tmpfile > $SERIES
                fi
                rm -f $tmpfile
@@ -192,6 +226,7 @@ insert_in_series()
 {
        local patch=$1 patch_args=$2
        local top=$(top_patch) tmpfile
+       local new_series=no
 
        if [ -n "$patch_args" ]
        then
@@ -227,8 +262,24 @@ insert_in_series()
        else
                echo "$patch$patch_args" > $tmpfile
        fi
+
+       [ -e "$SERIES" ] || new_series=yes
+
+       if [ "$new_series" = "no" ] && ! scm_modify_series "edit" "$SERIES"
+       then
+               rm -f $tmpfile
+               return 1
+       fi
+
        cat $tmpfile > $SERIES
        rm -f $tmpfile
+
+       if [ "$new_series" = "yes" ]
+       then
+               scm_modify_series "add" "$SERIES" || return 1
+       fi
+
+       return 0
 }
 
 remove_from_series()
@@ -240,7 +291,7 @@ remove_from_series()
        ! /^'"$(quote_re $patch)"'([ \t]|$)/ \
                                { print }
        ' $SERIES > $tmpfile
-       if [ $? -ne 0 ]
+       if [ $? -ne 0 ] || ! scm_modify_series "edit" "$SERIES"
        then
                rm -f $tmpfile
                return 1
@@ -261,7 +312,7 @@ rename_in_series()
                { print }
        END     { exit(! good) }
        ' $SERIES > $tmpfile
-       if [ $? -ne 0 ]
+       if [ $? -ne 0 ] || ! scm_modify_series "edit" "$SERIES"
        then
                rm -f $tmpfile
                return 1
Index: quilt-0.42/quilt/delete.in
===================================================================
--- quilt-0.42.orig/quilt/delete.in
+++ quilt-0.42/quilt/delete.in
@@ -146,6 +146,7 @@ then
                        exit 1
                fi
        fi
+       scm_modify_patch "delete" "$patch_file" || exit 1
 fi
 ### Local Variables:
 ### mode: shell-script
Index: quilt-0.42/quilt/fork.in
===================================================================
--- quilt-0.42.orig/quilt/fork.in
+++ quilt-0.42/quilt/fork.in
@@ -118,6 +118,13 @@ printf $"Fork of patch %s created as %s\
        "$(print_patch $top_patch)" \
        "$(print_patch $new_patch)"
 
+patch_file=$(patch_file_name "$new_patch")
+if [ -e "$patch_file" ]
+then
+       scm_modify_patch "add" "$patch_file" || exit 1
+fi
+
+exit 0
 ### Local Variables:
 ### mode: shell-script
 ### End:
Index: quilt-0.42/quilt/refresh.in
===================================================================
--- quilt-0.42.orig/quilt/refresh.in
+++ quilt-0.42/quilt/refresh.in
@@ -290,6 +290,14 @@ fi
 
 cat $tmp_patch >> $tmp_result
 
+if [ -e "$patch_file" ]
+then
+       scm_modify_patch "edit" "$patch_file" || die 1
+       newpatch=no
+else
+       newpatch=yes
+fi
+
 if [ -e $patch_file ] && \
    @DIFF@ -q $patch_file $tmp_result > /dev/null
 then
@@ -305,6 +313,11 @@ fi
 
 touch $QUILT_PC/$patch/.timestamp
 
+if [ "$newpatch" = "yes" ]
+then
+       scm_modify_patch "add" "$patch_file" || die 1
+fi
+
 rm -f $QUILT_PC/$patch~refresh
 if ! change_db_strip_level -p$opt_strip_level $patch
 then
Index: quilt-0.42/quilt/header.in
===================================================================
--- quilt-0.42.orig/quilt/header.in
+++ quilt-0.42/quilt/header.in
@@ -186,7 +186,11 @@ then
        | maybe_strip_trailing_whitespace
 else
        patch_file_or_null=/dev/null
-       [ -e "$patch_file" ] && patch_file_or_null=$patch_file
+       if [ -e "$patch_file" ]
+       then
+               patch_file_or_null=$patch_file
+               scm_modify_patch "edit" "$patch_file"
+       fi
 
        tmp=$(gen_tempfile) || exit 1
        tmp2=$(gen_tempfile) || exit 1
@@ -244,6 +248,11 @@ $"Replaced header of patch %s\n" "$(prin
                        printf \
 $"Appended text to header of patch %s\n" "$(print_patch $patch)"
                fi
+
+               if [ "$patch_file_or_null" = "/dev/null" ]
+               then
+                       scm_modify_patch "add" "$patch_file"
+               fi
        else
                exit 1
        fi
Index: quilt-0.42/quilt/rename.in
===================================================================
--- quilt-0.42.orig/quilt/rename.in
+++ quilt-0.42/quilt/rename.in
@@ -40,6 +40,8 @@ move_file()
 
        [ -d "$newdir" ] || mkdir -p "$newdir" || return 1
        mv "$old" "$new" || return 1
+       scm_modify_patch "add" "$new" || return 1
+       scm_modify_patch "delete" "$old" || return 1
        rmdir -p "$(dirname "$old")" 2> /dev/null
 
        return 0
cvs_operation()
{
        local op="$1" dir=$(dirname "$2") name=$(basename "$2")

        if [ -d "$dir/CVS" ]
        then
                case "$op" in
                add)
                        # Add file to source control
                        if ! (cd "$dir" && cvs -Q add -ko "$name")
                        then
                                printf $"CVS add failed for file \"%s\".\n" \
                                        "$dir/$name" >&2
                                return 1
                        fi
                        ;;
                edit)
                        # Enable modification to existing file
                        if [ ! -w "$dir/$name" ] &&
                            ! (cd "$dir" && cvs edit "$name")
                        then
                                printf $"CVS edit failed for file \"%s\".\n" \
                                        "$dir/$name" >&2
                                return 1
                        fi
                        ;;
                delete)
                        # Remove file from source control
                        if ! (cd "$dir" && cvs -Q remove "$name") ; then
                                printf $"CVS remove failed for file \"%s\".\n" \
                                        "$dir/$name" >&2
                                return 1
                        fi
                        ;;
                esac
        fi
        return 0
}

scm_modify_patch()
{
        cvs_operation "$1" "$2"
}

scm_modify_series()
{
        cvs_operation "$1" "$(realpath $2)"
}

reply via email to

[Prev in Thread] Current Thread [Next in Thread]